Wielokrotnie widziałem stwierdzenia typu „Proszę, uczyń tę funkcję obywatelem pierwszej klasy w takim czy innym języku / platformie”. Na przykład mówi się o wyliczeniach w C # / .net. Kiedy więc funkcja jest uważana za „obywatela pierwszej klasy” w języku / platformie programistycznej?
language-features
Gulszan
źródło
źródło
Pojęcie „pierwszorzędnego obywatela” lub „pierwszorzędnego elementu” w języku programowania zostało wprowadzone przez brytyjskiego informatyka Christophera Stracheya w latach 60. XX wieku w kontekście funkcji najwyższej klasy. Najbardziej znanym sformułowaniem tej zasady jest prawdopodobnie Struktura i interpretacja programów komputerowych Geralda Jaya Sussmana i Harry'ego Abelsona:
Zasadniczo oznacza to, że możesz zrobić z tym elementem języka programowania wszystko, co możesz zrobić ze wszystkimi innymi elementami w języku programowania.
Chodzi o „równe prawa”: możesz wykonać wszystkie powyższe czynności, używając, powiedzmy, liczb całkowitych, więc dlaczego inna rzecz ma być inna?
Powyższa definicja jest nieco restrykcyjna w tym sensie, że naprawdę mówi tylko o aspekcie pierwszorzędności związanym z byciem obiektami programu. Bardziej ogólną definicją byłoby, że rzecz jest najwyższej jakości, jeśli możesz zrobić z nią wszystko, co możesz zrobić z innymi rzeczami podobnego rodzaju.
Na przykład operatory Java i metody Java są podobnego rodzaju. Możesz definiować nowe metody, możesz (nieco) dowolnie wybierać nazwy własnych metod, możesz nadpisywać metody, możesz przeciążać metody. James Gosling może to wszystko zrobić również z operatorami, ale ty i ja nie. To znaczy, wbrew powszechnemu przekonaniu, Java czy przeciążanie operatorów wsparcia: na przykład,
+
operator jest przeciążony nabyte
,short
,int
,long
,float
,double
iString
, i IIRC w Javie 7 równieżBigInteger
iBigDecimal
(i zapewne kilka zapomniałem), tylko że ciebienie mam na to żadnego wpływu. To wyraźnie czyni operatorów drugiej klasy według tej drugiej definicji. Zauważ jednak, że metody nadal nie są obiektami pierwszej klasy zgodnie z pierwszą definicją. (Czy to czyni operatorów trzecią klasą?)źródło
Zwykle odnosi się to do konstrukcji, która jest przejezdna jako parametr, może być zdefiniowana jako typ zwracany przez funkcję lub może być przypisana wartość. Zwykle musisz być w stanie je zbudować w czasie wykonywania. Na przykład instancja klasy byłaby obywatelem pierwszej klasy w c ++ lub java, ale funkcja w C nie byłaby.
źródło
Powiedziałbym, że funkcja jest obywatelem pierwszej klasy, jeśli jest realizowana wyłącznie przez język.
tzn. nie wymaga wielu funkcji językowych ani standardowej biblioteki do wdrożenia tej funkcji.
Przykład:
W C / C ++ nie uważam funkcji za obywatela pierwszej klasy (inni mogą).
Jest tak, ponieważ istnieją sposoby manipulowania funkcjami, które są obsługiwane bezpośrednio przez język, ale wymagają użycia innych funkcji językowych. Wiązanie parametrów z funkcją nie jest bezpośrednio obsługiwane i aby zaimplementować tę funkcję, należy zbudować funktor.
źródło
Aby dodać przykład do już podanych odpowiedzi:
W WCF / C # musisz obecnie oznaczyć obiekt klasy za pomocą atrybutu umowy o świadczenie usług, aby działał on jako usługa. Nie ma czegoś takiego jak:
Klasa jest obywatelem pierwszej klasy w języku c #, w którym nie ma usługi.
Mam nadzieję że to pomoże
źródło