Objekter af første klasse ( engelsk førsteklasses objekt , førsteklasses enhed , førsteklasses borger ) i sammenhæng med et bestemt programmeringssprog er elementer, der kan videregives som en parameter, returneres fra en funktion, tildeles til en variabel [ 1] .
Begrebet objekter af første og anden klasse blev foreslået i 1967 af Christopher Strachey i artiklen "Understanding Programming Languages", hvor han sammenlignede procedurerne for Algol -sproget , i modsætning til reelle tal , med socialt diskriminerede "andenklasses borgere". " ( Engelske andenrangsborgere ) [2] .
Et objekt kaldes et "førsteklasses objekt", hvis det er [3] [4] :
Udtrykket "objekt" bruges her i en generel betydning og er ikke begrænset til programmeringssprogsobjekter . Således er værdierne af de enkleste datatyper , såsom heltal og float , "førsteklasses objekter" på mange sprog.
I C og C++ kan du ikke oprette funktioner under kørsel, så funktioner er ikke førsteklasses objekter på disse sprog. Samtidig kan funktionsmarkører sendes som et argument og returneres fra en anden funktion, hvorfor funktioner i C++ nogle gange kaldes andenklasses objekter . Men i C++ er der konceptet om et funktionsobjekt , som er et førsteklasses objekt og implementerer semantik svarende til funktioner [ 3] .
I Smalltalk [5] , Scala og JavaScript [6] er funktioner (metoder) og klasser førsteklasses objekter. Da operatorerne ( +, -) i det væsentlige er metoder i Smalltalk, er de også førsteklasses objekter.
Kodeeksempel på Nim -sprog .
# tildel proceduren til en variabel var værdi = proc () = ekko "værdi" værdi () # procedurekald var værdi2 = værdi værdi2 () # procedurekald # procedure vil blive videregivet til en anden proc to (): string = returner "to" # procedure vil modtage en anden procedure proc wrap ( x : proc ) = ekko "én" ekko x () ekko "tre" # kalder en procedure, der modtager en anden procedure som inputombrydning ( to ) # en procedure, der returnerer en procedure proc lukning ( x : int ): proc = proc res ( y : int ): int = return y * y + x return res var result = closure ( 2 ) # kalder en procedure , der vil returnere et andet procedure ekkoresultat ( 3 ) # kalder en intern procedure