Jeg har set mange gange udsagn som – “Gør denne funktion til en førsteklasses borger i sådan og så sprog / platform”. For eksempel siges det om enums i C # /. Net. Så hvornår betragtes en funktion som en “førsteklasses borger” på et programmeringssprog / platform?

Kommentarer

Svar

Definition

Et objekt er førsteklasses, når det:

  • kan lagres i variabler og datastrukturer
  • kan overføres som en parameter til en subrutine
  • kan returneres som et resultat af en subrutine
  • kan konstrueres ved kørsel
  • har egen identitet (uafhængigt af ethvert givet navn)

Udtrykket “objekt” bruges løst her, ikke nødvendigvis henvisning til objekter i objektorienteret programmering. De enkleste skalariske datatyper, såsom heltal og flydende tal, er næsten altid førsteklasses.

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

Kommentarer

  • Så hvad får enums til andet klasses objekt i .net / C #?
  • @Gulshan – du kan argumentere for manglen på egen identitet – C # enums er dybest set bare syntaktisk sukker (dvs. et ” givet navn “) for et heltal. Sammenlign med Java, hvor enums er objekter i sig selv.
  • @mikera, i .NET enums er værdier i sig selv. Java har bare ingen værdier, kun objekter, der ‘ er den eneste forskel.
  • @mikera: Selvom det forhindrer Java ‘ s enums fra at have nogle gode egenskaber som at være i stand til at repræsentere bitfelter med dem. Mens implementeringen sandsynligvis er mere førsteklasses-y, har de fleste af deres APIer stadig masser af heltalskonstanter (eller streng), og mange anvendelser af dem kan ikke let erstattes med enums.
  • Jeg don ‘ Tænk ikke, at enums kan konstrueres ved kørsel i .Net, kan de? Jeg troede, at de altid var konstanter.

Svar

Begrebet ” førsteklasses borger ” eller ” førsteklasses element ” på et programmeringssprog blev introduceret af den britiske computerforsker Christopher Strachey i 1960erne i forbindelse med første -klassefunktioner. Den mest berømte formulering af dette princip er sandsynligvis i Struktur og fortolkning af computerprogrammer af Gerald Jay Sussman og Harry Abelson:

  • De kan navngives ved hjælp af variabler.
  • De kan sendes som argumenter til procedurer.
  • De kan returneres som resultater af procedurer.
  • De kan inkluderes i datastrukturer.

Dybest set betyder det, at du kan gøre med dette programmeringssprogselement alt, hvad du kan gøre med alle andre elementer i programmeringssprog.

Det handler om ” lige rettigheder “: du kan gøre alt det ovenstående med f.eks. heltal, så hvorfor skulle nogen anden ting være anderledes?

Definitionen ovenfor er lidt restriktiv i den forstand, at den kun virkelig taler om aspektet af første klasses som relateret til at være objekter i programmet. En mere generel definition ville Det ville være, at en ting er førsteklasses, hvis du kan gøre alt sammen med det, kan du også gøre med andre ting af lignende art.

For eksempel er Java-operatører og Java-metoder af samme art. Du kan definere nye metoder, du kan (noget) frit vælge navnene på dine egne metoder, du kan tilsidesætte metoder, du kan overbelaste metoder. James Gosling kan også gøre alt dette med operatører, men du og jeg kan ikke. T. Jeg mener, i modsætning til almindelig tro, understø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å til BigInteger og BigDecimal (og sandsynligvis et par, jeg har glemt), det er bare, at du ikke har nogen indflydelse på det.Det gør operatører helt klart i anden klasse ifølge denne anden definition. Bemærk, at metoder stadig ikke er førsteklasses objekter i henhold til den første definition. (Gør det operatører til tredjeklasse?)

Kommentarer

  • Fantastisk svar. Så for eksempel siger pipenv docs ” Windows er en førsteklasses borger, i vores verden. ” Ville dette antyde, at du kan gøre alt med pipenv på Windows, som du også kan gøre med det på Linux?
  • Nej, jeg tror ikke ‘ Jeg tror ikke, at brugen af udtrykket ” førsteklasses borger ” har noget at gøre med den formelle programmeringssprogsteori definition af udtrykket. Jeg tror, pipenv bruger bare udtrykket med sin normale standard engelske betydning.
  • Som i ” behandlet retfærdigt? ” Tak for din hjælp.

Svar

Normalt denne refe rs til en konstruktion, der er godkendt som en parameter, kan defineres som en returtype fra en funktion eller kan tildeles en værdi. Normalt skal du være i stand til at konstruere dem ved kørsel. For eksempel ville en forekomst af en klasse være en førsteklasses borger i c ++ eller java, men en funktion i C ville ikke være.

Kommentarer

  • Hvad gør en klasse til en førsteklasses borger i c ++?
  • @bjarkef: Det lyder som om det allerede var besvaret ved at den matcher beskrivelsen i de foregående sætninger.
  • @Jonathan: Ja, undskyld, jeg læser forkert ” konstruerer dem ved kørsel “. Ja, du kan konstruere en forekomst af en klasse ved kørsel (et objekt), men ikke selve klassen. Det var det, der forvirrede mig.
  • At videregive parameter er stadig ikke nok. I C / C ++ vil jeg stadig betragte funktioner som andenklasses borgere. De kan sendes som parametre, returneres som resultater placeret i andre objekter. Men de kan ikke manipuleres uden hjælp fra andre konstruktioner (som std :: bind kræves for at binde parametre til en funktion).
  • @Martin Jeg sagde aldrig, at funktioner var førsteklasses borgere i C / C ++ .

Svar

Jeg vil sige, at en funktion er en førsteklasses borger, hvis den udelukkende implementeres af sproget .
dvs. det kræver ikke flere sprogfunktioner eller et standardbibliotek for at implementere denne funktion.

Eksempel:

I C / C ++ betragter jeg ikke funktioner som en første klasse borger (andre måske).
Dette skyldes, at der er måder at manipulere funktioner, der understøttes direkte af sproget, men kræver brug af andre sprogfunktioner. Bindende parametre til en funktion understøttes ikke direkte, og du skal oprette en funktor for at implementere denne funktion.

Kommentarer

  • Ville ikke ‘ t der gør, at bundne funktioner (eller ” lukninger “) ikke er førsteklasses, mens funktionerne selv er? Hvordan påvirker 0x ‘ understøttelse af lukninger din analyse?
  • @Fred Nurk: Det hele afhænger af sproget. På nogle sprog er lukninger førsteklasses systemer. I andre ikke. Jeg kender ikke C ++ 0x endnu til at komme med en eksplicit kommentar.
  • Lad ‘ sige, at sproget er enten C eller C ++ (men ikke 0x ), som i dit svar. Ville ‘ ikke din definition af ” førsteklasses ” gøre bundne funktioner (eller ” lukninger “) ikke være førsteklasses, mens funktionerne i sig selv er?
  • @Fred Nurk: Hvis du begrænser det eneste du kan gøre med en funktion er at gøre dem til en lukning, så sikker. Men for mig er ‘ ligesom at sige, om din platform kun understøtter tilføjelse af heltal ved kun at importere et bibliotek. Derefter er heltal førsteklasses borgere, men tilføjelse af heltal overvejes ikke. Efter min mening er lukning en operation, der kan udføres på en funktion, der effektivt returnerer en ny funktion (men det afhænger af, hvordan du definerer den). Men lukning og binding er kun to operationer, hvor mange andre udelukker vi fra diskussionen (jeg er ikke sikker på, at det var et spørgsmål).
  • @ Martin: Jeg må ikke forklare mig selv klart. Når ” er en funktion en førsteklasses borger, hvis den udelukkende er implementeret af sproget “, så implementeres funktioner i både C og C ++ udelukkende af sproget og ville således være førsteklasses. Bundne funktioner (som også kan kaldes ” lukninger “) er hvad du ‘ er taler om med bindende parametre osv., men at ‘ er en anden funktion.

Svar

For at tilføje et eksempel på de allerede leverede svar:

I WCF / C # skal du i øjeblikket markere et klasseobjekt med en serviceaftaleattribut for at få det til at fungere som en tjeneste. Der er ikke sådan noget som:

public **service** MyService (in relation public **class** MyClass). 

En klasse er en førsteklasses borger i c #, hvor en tjeneste ikke er.

Håber dette hjælper

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *