Jeg har sett utsagn som mange ganger – «Vennligst gjør denne funksjonen til en førsteklasses borger i så og så språk / plattform». For eksempel sies det om enums i C # /. Net. Så når blir en funksjon betraktet som en «førsteklasses borger» i et programmeringsspråk / plattform?
Kommentarer
- BTW: begrepet » førsteklasses borger » anbefales ikke, f.eks. av google styleguide for inkluderende språk som et sosialt ladet begrep: developers.google.com/style/inclusive-documentation
Svar
Definisjon
Et objekt er førsteklasses når det:
- kan lagres i variabler og datastrukturer
- kan overføres som parameter til en underrutine
- kan returneres som et resultat av en underrutine
- kan konstrueres ved kjøretid
- har egen identitet (uavhengig av ethvert gitt navn)
Begrepet «objekt» brukes løst her, ikke nødvendigvis å henvise til objekter i objektorientert programmering. De enkleste skalardatatypene, for eksempel heltall og flytende tall, er nesten alltid førsteklasses.
http://en.wikipedia.org/wiki/First_class_object
Kommentarer
- Så hva får enums til andre klasse objekt i .net / C #?
- @Gulshan – du kan argumentere for mangelen på egen identitet – C # enums er i utgangspunktet bare syntaktisk sukker (dvs. et » gitt navn «) for et heltall. Sammenlign med Java, der enums er objekter i seg selv.
- @mikera, i .NET enums er verdier i seg selv. Java har bare ingen verdier, bare objekter som ‘ er den eneste forskjellen.
- @mikera: Selv om det forhindrer Java ‘ er enums fra å ha noen fine egenskaper som å kunne representere bitfelt med dem. Mens implementeringen deres sannsynligvis er av førsteklasses kvalitet, har de fleste av APIene deres fortsatt mange heltall (eller streng) konstanter, og mange bruksområder av disse kan ikke lett erstattes med enums.
- Jeg don ‘ t tror at enums kan konstrueres på kjøretid i .Net, kan de ikke? Jeg trodde de alltid var konstanter.
Svar
Begrepet » førsteklasses borger » eller » førsteklasses element » på et programmeringsspråk ble introdusert av britisk informatiker Christopher Strachey på 1960-tallet i sammenheng med første -klassefunksjoner. Den mest berømte formuleringen av dette prinsippet er sannsynligvis i Struktur og tolkning av dataprogrammer av Gerald Jay Sussman og Harry Abelson:
- De kan navngis av variabler.
- De kan sendes som argumenter til prosedyrer.
- De kan returneres som resultat av prosedyrer.
- De kan inkluderes i datastrukturer.
I utgangspunktet betyr det at du kan gjøre med dette programmeringsspråkelement alt du kan gjøre med alle andre elementer i programmeringsspråket.
Det handler om » like rettigheter «: du kan gjøre alt det ovennevnte, med for eksempel heltall, så hvorfor skulle noen andre ting være annerledes?
Definisjonen ovenfor er litt begrensende i den forstand at den bare virkelig snakker om aspektet av førsteklassing som relatert til å være objekter i programmet. En mer generell definisjon vil Det kan være at en ting er førsteklasses hvis du kan gjøre alt med det, kan du også gjøre med andre ting av lignende art.
For eksempel er Java-operatører og Java-metoder av samme type. Du kan definere nye metoder, du kan (noe) fritt velge navn på dine egne metoder, du kan overstyre metoder, du kan overbelaste metoder. James Gosling kan også gjøre alt dette med operatører, men du og jeg kan ikke. Jeg mener, i motsetning til populær tro, støtter Java ikke operatøroverbelastning: for eksempel , +
-operatøren er overbelastet for byte
, short
, int
, long
, float
, double
og String
, og IIRC i Java 7 også for BigInteger
og BigDecimal
(og sannsynligvis et par jeg har glemt), det er bare at du ikke har noen innflytelse over det.Det gjør operatørene klart førsteklasses i henhold til denne andre definisjonen. Vær oppmerksom på at metodene fremdeles ikke er førsteklasses objekter i henhold til den første definisjonen. (Gjør det operatører til tredje klasse?)
Kommentarer
- Flott svar. Så sier for eksempel pipenv docs » Windows er en førsteklasses borger, i vår verden. » Ville dette innebære at du kan gjøre alt med
pipenv
på Windows som du også kan gjøre med det på Linux? - Nei, jeg tror ikke ‘ t tror at bruk av begrepet » førsteklasses borger » har noe å gjøre med den formelle programmeringsspråkteori definisjonen av begrepet. Jeg tror pipenv bare bruker begrepet med sin normale standard engelske betydning.
- Som i » behandlet rettferdig? » Takk for hjelpen.
Svar
Vanligvis denne refe rs til en konstruksjon som er farbar som en parameter, kan defineres som en returtype fra en funksjon eller kan tilordnes en verdi. Normalt må du være i stand til å konstruere dem ved kjøretid. For eksempel vil en forekomst av en klasse være en førsteklasses borger i c ++ eller java, men en funksjon i C ville ikke være det.
Kommentarer
- Hva gjør en klasse til en førsteklasses borger i c ++?
- @bjarkef: Høres ut som det allerede var besvart ved å samsvare med beskrivelsen som er gitt i de foregående setningene.
- @Jonathan: Ja, beklager, jeg leser feil på » konstruerer dem ved kjøretid «. Ja, du kan konstruere en forekomst av en klasse ved kjøretid (et objekt), men ikke selve klassen. Det var det som forvirret meg.
- Å passere parameter er fortsatt ikke nok. I C / C ++ vil jeg fortsatt betrakte funksjoner som andre klasses borgere. De kan sendes som parametere, returneres som resultater plassert i andre objekter. Men de kan ikke manipuleres uten hjelp fra andre konstruksjoner (som std :: bind kreves for å binde parametere til en funksjon).
- @Martin Jeg sa aldri at funksjoner var førsteklasses borgere i C / C ++ .
Svar
Jeg vil si at en funksjon er en førsteklasses borger hvis den utelukkende er implementert av språket .
dvs. det krever ikke flere språkfunksjoner eller et standardbibliotek for å implementere den funksjonen.
Eksempel:
I C / C ++ anser jeg ikke funksjoner som en første klasse borger (andre kan).
Dette er fordi det finnes måter å manipulere funksjoner som støttes direkte av språket, men som krever bruk av andre språkfunksjoner. Bindende parametere til en funksjon støttes ikke direkte, og du må bygge en funksjon for å implementere denne funksjonen.
Kommentarer
- Ville ikke ‘ t som gjør at bundne funksjoner (eller » nedleggelser «) ikke er førsteklasses, mens funksjonene i seg selv er det? Hvordan påvirker 0x ‘ s nedleggelser analysen din?
- @Fred Nurk: Alt avhenger av språket. På noen språk er nedleggelser førsteklasses systemer. I andre ikke. Jeg er ikke kjent nok med C ++ 0x ennå til å komme med en eksplisitt kommentar.
- La ‘ si at språket er enten C eller C ++ (men ikke 0x ), som i svaret ditt. Vil ikke ‘ t definisjonen din av » førsteklasses » lage bundne funksjoner (eller » nedleggelser «) ikke være førsteklasses, mens funksjonene i seg selv er?
- @Fred Nurk: Hvis du begrenser det eneste du kan gjøre med en funksjon er å gjøre dem til en nedleggelse, så sikkert. Men for meg er ‘ som å si om plattformen din støtter heltallstillegg bare ved å importere et bibliotek. Da er heltall førsteklasses borgere, men tillegg av heltall blir ikke vurdert. Etter mitt syn er lukking en operasjon som kan utføres på en funksjon som effektivt returnerer en ny funksjon (men det avhenger av hvordan du definerer den). Men lukking og binding er bare to operasjoner hvor mange andre vi ekskluderer fra diskusjonen (jeg er ikke sikker på at det var et spørsmål).
- @ Martin: Jeg må ikke forklare meg tydelig. Gitt » en funksjon er en førsteklasses borger hvis den utelukkende er implementert av språket «, blir funksjoner i både C og C ++ implementert utelukkende av språket og ville dermed være førsteklasses. Bundet funksjoner (som også kan kalles » nedleggelser «) er det du ‘ snakker om med bindende parametere osv., men at ‘ er en annen funksjon.
Svar
Slik legger du til et eksempel på svarene som allerede er oppgitt:
I WCF / C # du må for øyeblikket merke et klasseobjekt med et serviceavtaleattributt for å få det til å fungere som en tjeneste. Det er ikke noe som heter:
public **service** MyService (in relation public **class** MyClass).
En klasse er en førsteklasses borger i c #, hvor en tjeneste ikke er.
Håp dette hjelper