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

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску

Объектами первого класса (англ. 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)
  6. Functions are first class objects in JavaScript (недоступная ссылка). Дата обращения 21 июля 2012. Архивировано 27 июля 2012 года.