Jag har sett många gånger uttalanden som- ”Gör den här funktionen till en förstklassig medborgare i så och så språk / plattform”. Till exempel sägs det om enum i C # /. Net. Så när betraktas en funktion som en ”förstklassig medborgare” på ett programmeringsspråk / plattform?
Kommentarer
- BTW: termen ” förstklassig medborgare ” rekommenderas t.ex. av google styleguide för inkluderande språk som en socialt laddad term: developers.google.com/style/inclusive-documentation
Svar
Definition
Ett objekt är förstklassigt när det:
- kan lagras i variabler och datastrukturer
- kan skickas som en parameter till en subrutin
- kan returneras som ett resultat av en subrutin
- kan konstrueras vid körning
- har inneboende identitet (oberoende av vilket namn som helst)
Termen ”objekt” används löst här, inte nödvändigtvis hänvisa till objekt i objektorienterad programmering. De enklaste skalära datatyperna, som heltal och flytpunktsnummer, är nästan alltid förstklassiga.
http://en.wikipedia.org/wiki/First_class_object
Kommentarer
- Så, vad gör enums andra klassens objekt i .net / C #?
- @Gulshan – du kan argumentera för bristen på inneboende identitet – C # enums är i grunden bara syntaktiskt socker (dvs. ett ” förnamn ”) för ett heltal. Jämför med Java, där enums är objekt i sig.
- @mikera, i .NET enums är värden i sig. Java har bara inga värden, bara objekt som ’ är den enda skillnaden.
- @mikera: Även om det hindrar Java ’ s enum från att ha några fina egenskaper som att kunna representera bitfält med dem. Medan implementeringen förmodligen är mer förstklassig, har de flesta av deras API fortfarande gott om heltal (eller sträng) konstanter och många användningar av dessa kan inte enkelt ersättas med enums.
- Jag don ’ tänker att enum kan konstrueras vid körning i .Net, eller hur? Jag trodde att de alltid var konstanter.
Svar
Begreppet ” förstklassig medborgare ” eller ” förstklassigt element ” på ett programmeringsspråk introducerades av den brittiska datavetaren Christopher Strachey på 1960-talet i samband med första -klassfunktioner. Den mest kända formuleringen av denna princip finns troligen i Struktur och tolkning av datorprogram av Gerald Jay Sussman och Harry Abelson:
- De kan namnges av variabler.
- De kan skickas som argument till procedurer.
- De kan returneras som resultat av procedurer.
- De kan inkluderas i datastrukturer.
I grund och botten betyder det att du kan göra med detta programmeringsspråkelement allt du kan göra med alla andra element i programmeringsspråket.
Det handlar om ” lika rättigheter ”: du kan göra allt ovan, med, säg, heltal, så varför skulle någon annan sak vara annorlunda?
Definitionen ovan är lite restriktiv i den meningen att den bara verkligen talar om aspekten av förstklassighet som relaterad till att vara objekt i programmet. En mer allmän definition var Det skulle vara att en sak är förstklassig om du kan göra allt med det kan du också göra med andra saker av liknande slag.
Till exempel är Java-operatörer och Java-metoder av samma slag. Du kan definiera nya metoder, du kan (något) fritt välja namnen på dina egna metoder, du kan åsidosätta metoder, du kan överbelasta metoder. James Gosling kan göra allt detta med operatörer också, men du och jag kan inte. Jag menar, i motsats till vad många tror, stöder Java operatörsöverbelastning: till exempel , operatorn +
är överbelastad för byte
, short
, int
, long
, float
, double
och String
och IIRC i Java 7 också för BigInteger
och BigDecimal
(och förmodligen ett par som jag glömde), det är bara att du inte har något inflytande över det.Det gör operatörer helt klart andra klass enligt denna andra definition. Observera att metoder fortfarande inte är förstklassiga objekt enligt den första definitionen. (Gör det operatörer till tredje klass?)
Kommentarer
- Bra svar. Så säger till exempel pipenv docs ” Windows är en förstklassig medborgare, i vår värld. ” Skulle detta innebära att du kan göra allt med
pipenv
på Windows som du också kan göra med det på Linux? - Nej, jag tror inte ’ att användningen av termen ” förstklassig medborgare ” har någonting att göra med den formella programmeringsspråksteorin definitionen av termen. Jag tror att pipenv bara använder termen med sin normala engelska betydelse.
- Som i ” behandlas rättvist? ” Tack för din hjälp.
Svar
Vanligtvis denna refe rs till en konstruktion som är godkänd som en parameter, kan definieras som en returtyp från en funktion eller kan tilldelas ett värde. Normalt måste du kunna konstruera dem vid körning. Till exempel skulle en förekomst av en klass vara en förstklassig medborgare i c ++ eller java, men en funktion i C skulle inte vara det.
Kommentarer
- Vad gör en klass till förstklassig medborgare i c ++?
- @bjarkef: Det låter som att det redan var besvarat genom att den matchar beskrivningen i föregående meningar.
- @Jonathan: Ja, förlåt, jag läste fel ” konstruerar dem vid körning ”. Ja, du kan konstruera en instans av en klass vid körning (ett objekt), men inte själva klassen. Det är det som förvirrade mig.
- Att skicka parameter är fortfarande inte tillräckligt. I C / C ++ skulle jag fortfarande betrakta funktioner som andra klassens medborgare. De kan skickas som parametrar, returneras som resultat placerade i andra objekt. Men de kan inte manipuleras utan hjälp av andra konstruktioner (som std :: bind krävs för att binda parametrar till en funktion).
- @ Martin Jag sa aldrig att funktioner var förstklassiga medborgare i C / C ++ .
Svar
Jag skulle säga att en funktion är en förstklassig medborgare om den enbart implementeras av språket .
dvs det kräver inte flera språkfunktioner eller ett standardbibliotek för att implementera den funktionen.
Exempel:
I C / C ++ anser jag inte att funktioner är en första klassmedborgare (andra kanske).
Detta beror på att det finns sätt att manipulera funktioner som stöds direkt av språket men som kräver användning av andra språkfunktioner. Bindningsparametrar till en funktion stöds inte direkt och du måste bygga en funktion för att implementera den här funktionen.
Kommentarer
- Skulle ’ t som gör att bundna funktioner (eller ” stängningar ”) inte är förstklassiga, medan själva funktionerna är? Hur påverkar 0x ’ för stängning din analys?
- @Fred Nurk: Allt beror på språket. På vissa språk är stängningar förstklassiga system. I andra inte. Jag är inte tillräckligt bekant med C ++ 0x ännu för att göra en uttrycklig kommentar.
- Låt ’ säga att språket är antingen C eller C ++ (men inte 0x ), som i ditt svar. Skulle ’ inte din definition av ” förstklassig ” göra bundna funktioner (eller ” stängningar ”) inte vara förstklassiga, medan själva funktionerna är?
- @Fred Nurk: Om du begränsar det enda du kan göra med en funktion är att göra dem till en stängning, då säker. Men för mig är det ’ som att säga om din plattform stöder tillägg av heltal bara genom att importera ett bibliotek. Då är heltal förstklassiga medborgare men tillägg av heltal beaktas inte. Enligt min åsikt är stängning en operation som kan utföras på en funktion som effektivt returnerar en ny funktion (men det beror på hur du definierar den). Men stängning och bindning är bara två operationer hur många andra vi utesluter från diskussionen (jag är inte säker på att det var en fråga).
- @ Martin: Jag får inte förklara mig själv tydligt. Med tanke på ” är en funktion en förstklassig medborgare om den enbart implementeras av språket ”, så implementeras funktioner i både C och C ++ enbart av språket och skulle således vara förstklassig. Bundna funktioner (som också kan kallas ” stängningar ”) är vad du ’ talar om med bindande parametrar etc. men att ’ är en annan funktion.
Svar
För att lägga till ett exempel på de svar som redan tillhandahållits:
I WCF / C # du måste för närvarande markera ett klassobjekt med ett serviceavtal för att få det att fungera som en tjänst. Det finns inget sådant som:
public **service** MyService (in relation public **class** MyClass).
En klass är en förstklassig medborgare i c #, där en tjänst inte är.
Hopp detta hjälper