Obiectele de primă clasă ( în limba engleză obiect de primă clasă , entitate de primă clasă, cetățean de primă clasă ) în contextul unui anumit limbaj de programare sunt elemente care pot fi trecute ca parametru, returnate dintr-o funcție, atribuite unei variabile [ 1] .
Conceptul de obiecte de clasa I și II a fost propus în 1967 de Christopher Strachey în articolul „Înțelegerea limbajelor de programare”, unde a comparat procedurile limbajului Algol , spre deosebire de numerele reale , cu „cetățeni de clasa a doua” discriminați social. ” ( cetățeni englezi de clasa a doua ) [2] .
Un obiect este numit „obiect de primă clasă” dacă este [3] [4] :
Termenul „obiect” este folosit aici într-un sens general și nu se limitează la obiectele limbajului de programare . Astfel, valorile celor mai simple tipuri de date , cum ar fi integer și float , sunt „obiecte de primă clasă” în multe limbi.
În C și C++ , nu puteți crea funcții în timpul execuției, așa că funcțiile nu sunt obiecte de primă clasă în acele limbaje. În același timp, indicatorii de funcție pot fi trecuți ca argument și returnați de la o altă funcție, motiv pentru care funcțiile din C++ sunt uneori numite obiecte de clasa a doua . Totuși, în C++ există conceptul de obiect funcție , care este un obiect de primă clasă și implementează o semantică echivalentă cu funcțiile [3] .
În Smalltalk [5] , Scala și JavaScript [6] funcțiile (metodele) și clasele sunt obiecte de primă clasă. Deoarece operatorii ( +, -) sunt în esență metode în Smalltalk, ei sunt, de asemenea, obiecte de primă clasă.
Exemplu de cod în limba Nim .
# atribuiți procedura unei variabile var value = proc () = echo "valoare" valoare () # apel de procedură var valoare2 = valoare valoare2 () # apel de procedură # procedura va fi transmisă unui alt proces doi (): șir = returnează „două” # procedura va primi o altă procedură proc wrap ( x : proc ) = echo „one” echo x () echo „trei” # apelați o procedură care primește o altă procedură ca împachetare de intrare ( două ) # o procedură care returnează o procedură proc closure ( x : int ): proc = proc res ( y : int ): int = return y * y + x return res var rezultat = closure ( 2 ) # apelează o procedură care va returna o altă procedură echo result ( 3 ) # apelează o procedură internă