Ik heb vaak uitspraken gezien als: “Maak van deze functie een eersteklas burger in zo-en-zo taal / platform”. Er wordt bijvoorbeeld gezegd over enums in C # / .net. Dus, wanneer wordt een functie beschouwd als een “eersteklas burger” in een programmeertaal / platform?

Reacties

Answer

Definitie

Een object is eersteklas wanneer het:

  • kan worden opgeslagen in variabelen en datastructuren
  • kan als parameter worden doorgegeven aan een subroutine
  • kan worden geretourneerd als resultaat van een subroutine
  • kan tijdens runtime worden geconstrueerd
  • heeft intrinsieke identiteit (onafhankelijk van een bepaalde naam)

De term “object” wordt hier losjes gebruikt, verwijst niet noodzakelijkerwijs naar objecten in objectgeoriënteerd programmeren. De eenvoudigste scalaire gegevenstypen, zoals gehele getallen en getallen met drijvende komma, zijn bijna altijd eersteklas.

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

Reacties

  • Dus, wat maakt enums een tweede klasse object in .net / C #?
  • @Gulshan – je zou het gebrek aan intrinsieke identiteit kunnen beargumenteren – C # -enums zijn eigenlijk gewoon syntactische suiker (dwz een ” voornaam “) voor een geheel getal. Vergelijk met Java, waar de enums op zichzelf staande objecten zijn.
  • @mikera, in .NET enums zijn op zichzelf staande waarden. Java heeft gewoon geen waarden, alleen objecten, die ‘ het enige verschil is.
  • @mikera: Hoewel dat Java voorkomt ‘ s enums omdat ze een aantal leuke eigenschappen hebben, zoals het kunnen vertegenwoordigen van bitvelden ermee. Hoewel hun implementatie waarschijnlijk meer eersteklas is, hebben de meeste van hun APIs nog steeds veel integer (of string) constanten en veel toepassingen daarvan kunnen niet gemakkelijk worden vervangen door enums.
  • Ik don ‘ Ik denk niet dat enums kunnen worden gemaakt tijdens runtime in .Net, toch? Ik dacht dat het altijd constanten waren.

Antwoord

Het begrip ” eersteklas burger ” of ” eersteklas element ” in een programmeertaal werd geïntroduceerd door de Britse computerwetenschapper Christopher Strachey in de jaren zestig in de context van de eerste -klasse functies. De meest bekende formulering van dit principe is waarschijnlijk in Structuur en interpretatie van computerprogrammas door Gerald Jay Sussman en Harry Abelson:

  • Ze kunnen worden genoemd door variabelen.
  • Ze kunnen worden doorgegeven als argumenten voor procedures.
  • Ze kunnen worden geretourneerd als de resultaten van procedures.
  • Ze kunnen worden opgenomen in datastructuren.

Kort gezegd betekent dit dat u hiermee kunt doen programmeertaalelement alles wat u kunt doen met alle andere elementen in de programmeertaal.

Het gaat allemaal om ” gelijke rechten “: je kunt al het bovenstaande doen, bijvoorbeeld met gehele getallen, dus waarom zou iets anders anders zijn?

De bovenstaande definitie is een beetje beperkend in die zin dat het alleen echt spreekt over het aspect van eersteklasheid in verband met het zijn van objecten van het programma. Een meer algemene definitie wou Het zou zijn dat iets eersteklas is als je er alles mee kunt doen wat je ook kunt doen met andere soortgelijke dingen.

Bijvoorbeeld, Java-operators en Java-methoden zijn vergelijkbaar. U kunt nieuwe methoden definiëren, u kunt (enigszins) vrij de namen van uw eigen methoden kiezen, u kunt methoden overschrijven, u kunt methoden overbelasten. James Gosling kan dat allemaal ook met operators doen, maar jij en ik kunnen “t. Ik bedoel, in tegenstelling tot wat vaak wordt gedacht, ondersteunt Java wel overbelasting van operators: bijvoorbeeld , de + operator is overbelast voor byte, short, int, long, float, double en String, en IIRC in Java 7 ook voor BigInteger en BigDecimal (en waarschijnlijk een paar ben ik vergeten), het is alleen dat jij er geen enkele invloed op heeft.Dat maakt operators duidelijk tweederangs volgens deze tweede definitie. Merk echter op dat methoden nog steeds “geen eersteklas objecten zijn volgens de eerste definitie. (Maakt dat operators tot derde klasse?)

Opmerkingen

  • Goed antwoord. Dus, bijvoorbeeld, de pipenv-documenten zeggen dat ” Windows een eersteklas burger is, in onze wereld. ” Zou dit betekenen dat je alles kunt doen met pipenv op Windows dat je er ook mee kunt doen op Linux?
  • Nee, ‘ denk ik niet dat het gebruik van de term ” eersteklas burger ” heeft iets te maken met de formele Programming Language Theory -definitie van de term. Ik denk dat pipenv de term alleen gebruikt met zijn normale standaard Engelse betekenis.
  • Zoals in ” eerlijk behandeld? ” Bedankt voor je hulp.

Antwoord

Meestal is deze refe rs naar een construct dat acceptabel is als parameter, kan worden gedefinieerd als een retourtype van een functie of waaraan een waarde kan worden toegewezen. Normaal gesproken moet u ze tijdens runtime kunnen bouwen. Een instantie van een klasse zou bijvoorbeeld een eersteklas burger zijn in c ++ of java, maar een functie in C zou dat niet zijn.

Reacties

  • Wat maakt een klas een eersteklas burger in c ++?
  • @bjarkef: Klinkt alsof dat al beantwoord is doordat het overeenkomt met de beschrijving in de voorgaande zinnen.
  • @Jonathan: Ja, sorry, ik heb de ” tijdens runtime verkeerd gelezen “. Ja, je kunt tijdens runtime een instantie van een klasse construeren (een object), maar niet de klasse zelf. Dat heeft me in de war gebracht.
  • Het doorgeven van een parameter is nog steeds niet genoeg. In C / C ++ zou ik functies nog steeds als tweederangsburgers beschouwen. Ze kunnen worden doorgegeven als parameters, geretourneerd als resultaten die in andere objecten zijn geplaatst. Maar ze kunnen niet worden gemanipuleerd zonder de hulp van andere constructies (zoals std :: bind is vereist om parameters aan een functie te binden).
  • @Martin Ik heb nooit gezegd dat functies eersteklas burgers waren in C / C ++ .

Antwoord

Ik zou zeggen dat een functie een eersteklas burger is als deze uitsluitend door de taal wordt geïmplementeerd .
dwz het vereist geen meerdere taalfuncties of een standaardbibliotheek om die functie te implementeren.

Voorbeeld:

In C / C ++ beschouw ik functies niet als een eerste class citizen (anderen misschien).
Dit komt omdat er manieren zijn om functies te manipuleren die direct door de taal worden ondersteund, maar waarvoor het gebruik van andere taalfuncties vereist is. Het koppelen van parameters aan een functie wordt niet rechtstreeks ondersteund en u moet een functor bouwen om deze functie te implementeren.

Opmerkingen

  • Zou niet ‘ t waardoor gebonden functies (of ” sluitingen “) niet eersteklas zijn, terwijl de functies zelf dat wel zijn? Hoe speelt de ondersteuning van 0x ‘ s ondersteuning voor sluitingen een rol in uw analyse?
  • @Fred Nurk: Het hangt allemaal af van de taal. In sommige talen zijn sluitingen eersteklas systemen. In andere niet. Ik ben nog niet genoeg bekend met C ++ 0x om een expliciete opmerking te maken.
  • Laat ‘ s zeggen dat de taal C of C ++ is (maar niet 0x ), zoals in je antwoord. Zou niet ‘ t uw definitie van ” eersteklas ” gebonden functies maken (of ” sluitingen “) niet eersteklas zijn, terwijl functies zelf dat wel zijn?
  • @Fred Nurk: als je limiet het enige dat je met een functie kunt doen, is er een sluiting van maken, dan natuurlijk. Maar voor mij is dat ‘ zoiets als zeggen of je platform het optellen van gehele getallen alleen ondersteunt door een bibliotheek te importeren. Gehele getallen zijn dan eersteklas burgers, maar toevoeging van gehele getallen wordt niet overwogen. Naar mijn mening is sluiting een bewerking die kan worden uitgevoerd op een functie die effectief een nieuwe functie retourneert (maar het hangt ervan af hoe u deze definieert). Maar afsluiten en binden zijn slechts twee operaties, hoeveel anderen sluiten we uit van de discussie (ik weet niet zeker of dat een vraag was).
  • @Martin: Ik moet mezelf niet duidelijk uitleggen. Gegeven ” is een functie een eersteklas burger als deze uitsluitend wordt geïmplementeerd door de taal “, dan worden functies in zowel C als C ++ geïmplementeerd alleen door de taal en zou dus eersteklas zijn. Gebonden functies (die ook ” sluitingen ” kunnen worden genoemd) zijn wat u ‘ re praten over bindende parameters, etc., maar dat ‘ is een andere functie.

Antwoord

Om een voorbeeld toe te voegen aan de reeds gegeven antwoorden:

In WCF / C # u moet momenteel een klasseobject markeren met een servicecontractkenmerk om het als een service te laten werken. Er bestaat niet zoiets als:

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

Een klas is een eersteklas burger in c #, waar een dienst dat niet is.

Hoop dit helpt

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *