Объект первого класса

Из Википедии, бесплатной энциклопедии

Объектами первого класса (англ. 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) # вызов внутренней процедуры 

Примечания[править | править код]

  1. Scott, Michael. Programming Language Pragmatics (неопр.). — San Francisco, CA: Morgan Kaufmann Publishers, 2006. — С. 140.
  2. Rod Burstall, «Christopher Strachey—Understanding Programming Languages», Higher-Order and Symbolic Computation 13:52 (2000). Дата обращения: 2 ноября 2013. Архивировано из оригинала 12 августа 2017 года.
  3. 1 2 First Class. C2.com (25 января 2006). Дата обращения: 16 июля 2012. Архивировано 16 июля 2012 года.
  4. first class object. Catalysoft.com. Дата обращения: 9 октября 2010. Архивировано 6 августа 2012 года.
  5. First class functions in many programming languages (examples). Дата обращения: 21 июля 2012. Архивировано 11 июня 2010 года.
  6. Functions are first class objects in JavaScript. Дата обращения: 21 июля 2012. Архивировано из оригинала 27 июля 2012 года.