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

Объектами первого класса ( англ. first-class object , first-class entity , first-class citizen ) в контексте конкретного языка программирования называются элементы, которые могут быть переданы как параметр, возвращены из функции, присвоены переменной .

Понятие объектов первого и второго классов было предложено в 1967 г. Кристофером Стрэчи в статье «Understanding Programming Languages», где процедуры языка Алгол , в противоположность действительным числам , он сравнил с подвергающимися социальной дискриминации «людьми второго сорта» ( англ. second-class citizens ) .

Определение

Объект называют «объектом первого класса», если он :

Термин «объект» используется здесь в общем смысле и не ограничивается объектами языка программирования . Так, значения простейших типов данных , например, integer и float , во многих языках являются «объектами первого класса».

Примеры

В C и C++ нельзя создавать функции во время выполнения программы, поэтому функции не являются объектами первого класса в этих языках. В то же время указатели на функцию можно передавать в качестве аргумента и возвращать из другой функции, поэтому иногда функции в C++ называют объектами второго класса ( англ. second-class object ). Тем не менее, в C++ есть понятие функционального объекта ( англ. function object ), который является объектом первого класса и реализует эквивалентную функциям семантику .

В Smalltalk , Scala , и JavaScript функции (методы) и классы являются объектами первого класса. Поскольку операторы ( + , - ) в 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. (неопр.) . — San Francisco, CA: Morgan Kaufmann Publishers , 2006. — С. .
  2. . Дата обращения: 2 ноября 2013. Архивировано из 12 августа 2017 года.
  3. . C2.com (25 января 2006). Дата обращения: 16 июля 2012. 16 июля 2012 года.
  4. . Catalysoft.com. Дата обращения: 9 октября 2010. 6 августа 2012 года.
  5. . Дата обращения: 21 июля 2012. 11 июня 2010 года.
  6. . Дата обращения: 21 июля 2012. Архивировано из 27 июля 2012 года.
Источник —

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