it-swarm-eu.dev

Kdy je vlastnost považována za „občana první třídy“ v programovacím jazyce / platformě?

Viděl jsem mnohokrát výroky jako: „Prosím, udělejte z této funkce prvotřídního občana v takovém jazyce a platformě“. Například se říká o výčtech v C # /. Net. Kdy je tedy funkce považována za „občana první třídy“ v programovacím jazyce/platformě?

64
Gulshan

Definice

Objekt je prvotřídní, když:

  • lze uložit do proměnných a datových struktur
  • lze předat jako parametr do podprogramu
  • lze vrátit v důsledku podprogramu
  • lze sestavit za běhu
  • má vlastní identitu (nezávisle na jakémkoli daném jménu)

Pojem „objekt“ se zde používá volně, nemusí se nutně odkazovat na objekty v objektově orientovaném programování. Nejjednodušší skalární datové typy, jako jsou celá čísla a čísla s pohyblivou řádovou čárkou, jsou téměř vždy prvotřídní.

http://en.wikipedia.org/wiki/First_class_object

42
Waquo

Pojem „prvotřídní občan“ nebo „prvotřídní prvek“ v programovacím jazyce byl představen britským počítačovým vědcem Christopher Strachey v 60. letech v souvislosti s první funkce třídy. Nejslavnější formulace tohoto principu je pravděpodobně v Struktura a interpretace počítačových programů Geralda Jaye Sussmana a Harryho Abelsona:

  • Mohou být pojmenovány podle proměnných.
  • Mohou být předány jako argumenty procedurám.
  • Mohou být vráceny jako výsledek postupů.
  • Mohou být zahrnuty do datových struktur.

V zásadě to znamená, že s tímto prvkem programovacího jazyka můžete dělat vše, co můžete dělat se všemi ostatními prvky v programovacím jazyce.

Je to všechno o „stejných právech“: můžete udělat vše výše uvedené, řekněme celá čísla, tak proč by se měla jiná věc lišit?

Výše uvedená definice je poněkud restriktivní v tom smyslu, že skutečně hovoří pouze o aspektu prvotřídnosti ve vztahu k tomu, že jsou objekty programu. Obecnější definice by byla, že věc je prvotřídní, pokud s ní můžete dělat vše, co můžete, můžete také dělat s jinými věcmi podobného druhu.

Například metody Java operátory a Java= metody jsou podobné). Můžete definovat nové metody, můžete (poněkud) volně zvolit názvy vlastních metod , můžete potlačit metody, můžete přetížit metody. James Gosling to všechno může udělat také s operátory, ale vy a já nemůžete. na rozdíl od všeobecného přesvědčení znamená Java ) přetížení operátora : například + operátor je přetížen pro byte, short, int, long, float, double a String a IIRC v Java 7 také pro BigInteger a BigDecimal (a pravděpodobně pár, na které jsem zapomněl), je to jen to vy na to nemáte žádný vliv. To jasně činí operátory druhou třídou podle této druhé definice. Všimněte si, že metody stále nejsou prvotřídními objekty podle první definice, i když. (Díky tomu jsou operátoři třetí třídou?)

33
Jörg W Mittag

Obvykle se jedná o konstrukci, která je průchodná jako parametr, může být definována jako návratový typ z funkce nebo může být přiřazena hodnota. Normálně je musíte umět postavit za běhu. Například instancí třídy by byl občan první třídy v jazyce c ++ nebo Java, ale funkce v jazyce C by nebyla.

6
Pemdas

Řekl bych, že vlastnost je prvotřídní občan, pokud je implementován výhradně jazykem.
tj. k implementaci této funkce nevyžaduje více jazykových funkcí ani standardní knihovnu.

Příklad:

V C/C++ nepovažuji funkce za prvotřídního občana (ostatní mohou).
Je to proto, že existují způsoby, jak manipulovat s funkcemi, které jsou přímo podporovány jazykem, ale vyžadují použití dalších jazykových funkcí. Vazebné parametry k funkci nejsou přímo podporovány a pro implementaci této funkce musíte vytvořit funktor.

1
Martin York