Объектами первого класса (англ. first-class object, first-class entity, first-class citizen) в контексте конкретного языка программирования называются элементы, которые могут быть переданы как параметр, возвращены из функции, присвоены переменной[1].
Понятие объектов первого и второго классов было предложено в 1967 г. Кристофером Стрэчи в статье «Understanding Programming Languages», где процедуры языка Алгол, в противоположность действительным числам, он сравнил с подвергающимися социальной дискриминации «людьми второго сорта» (англ. second-class citizens)[2].
Объект называют «объектом первого класса», если он[3][4]:
Термин «объект» используется здесь в общем смысле, и не ограничивается объектами языка программирования. Так значения простейших типов данных, например integer и float, во многих языках являются «объектами первого класса».
В C и C++ нельзя создавать функции во время выполнения программы, поэтому функции не являются объектами первого класса в этих языках. В то же время указатели на функцию можно передавать в качестве аргумента и возвращать из другой функции, поэтому иногда функции в C++ называют объектами второго класса (англ. second-class object). Тем не менее, в C++ есть понятие функционального объекта (англ. function object), который является объектом первого класса и реализует эквивалентную функциям семантику[3].
В Smalltalk[5] , Scala, и JavaScript[6] функции (методы) и классы являются объектами первого класса. Поскольку операторы (+
, -
) в Smalltalk по сути методы, они также являются объектами первого класса.
Пример кода на языке Nim.
# присвоим процедуру переменной
var value = proc() =
echo "value"
value() # вызов процедуры
var value2 = value
value2() # вызов процедуры
# процедура будет передана другой
proc two(): string =
return "two"
# процедура будет получать другую процедуру
proc wrap(x: proc) =
echo "one"
echo x()
echo "three"
# вызов процедуры которая получает на вход другую процедуру
wrap(two)
# процедура, которая возвращает процедуру
proc closure(x: int): proc =
proc res(y:int): int =
return y*y+x
return res
var result = closure(2) # вызовем процедуру которая вернет другую процедуру
echo result(3) # вызов внутренней процедуры
![]() |
Это заготовка статьи о программировании. Вы можете помочь проекту, дополнив её. |
Данная страница на сайте WikiSort.ru содержит текст со страницы сайта "Википедия".
Если Вы хотите её отредактировать, то можете сделать это на странице редактирования в Википедии.
Если сделанные Вами правки не будут кем-нибудь удалены, то через несколько дней они появятся на сайте WikiSort.ru .