Объект первого класса: различия между версиями

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
[отпатрулированная версия][отпатрулированная версия]
Содержимое удалено Содержимое добавлено
м викификация
Метки: с мобильного устройства через мобильное приложение через приложение для Android
 
(не показано 30 промежуточных версий 19 участников)
Строка 1: Строка 1:
'''Объектами первого класса''' («first-class object») в контексте конкретного [[язык программирования|языка программирования]] называются сущности, которые могут быть переданы как параметр, возвращены из функции, присвоены переменной<ref>{{cite book |title= Programming Language Pragmatics |last= Scott |first= Michael |authorlink= |coauthors= |year= 2006 |publisher= Morgan Kaufmann Publishers |location= San Francisco, CA |isbn= |oclc= |page= 140 |pages= |url= |accessdate=}}</ref>.
'''Объектами первого класса''' ({{lang-en|first-class object}}, {{lang-en2|first-class entity}}, {{lang-en2|first-class citizen}}) в контексте конкретного [[язык программирования|языка программирования]] называются элементы, которые могут быть переданы как параметр, возвращены из функции, присвоены [[Переменная (программирование)|переменной]]<ref>{{книга |заглавие=Programming Language Pragmatics |ссылка=https://archive.org/details/programminglangu00scot_812 |год=2006 |издательство=[[Morgan Kaufmann Publishers]] |место=San Francisco, CA |страницы=[https://archive.org/details/programminglangu00scot_812/page/n172 140] |ref=Scott |язык=und |автор=Scott, Michael}}</ref>.


Понятие объектов первого и второго классов было предложено в 1967 г. Кристофером Стрэчи в статье «Understanding Programming Languages», где процедуры языка [[Алгол]], в противоположность [[Действительные числа|действительным числам]], он сравнил с подвергающимися социальной дискриминации «людьми второго сорта» ({{lang-en|second-class citizens}})<ref>{{Cite web |url=http://www.itu.dk/courses/BPRD/E2009/fundamental-1967.pdf |title=Rod Burstall, «Christopher Strachey—Understanding Programming Languages», ''Higher-Order and Symbolic Computation'' '''13''':52 (2000) |accessdate=2013-11-02 |archiveurl=https://web.archive.org/web/20170812012310/http://www.itu.dk/courses/BPRD/E2009/fundamental-1967.pdf |archivedate=2017-08-12 |deadlink=yes }}</ref>.
Термин был впервые использован в контексте «функции как объекты первого класса» в середине 1960-х<ref>Rod Burstall, «Christopher Strachey—Understanding Programming Languages», ''Higher-Order and Symbolic Computation'' '''13''':52 (2000)</ref>.


== Определение ==
== Определение ==
Объект называют «объектом первого класса», если он<ref name="c2FirstClass">{{cite web
|url = http://www.c2.com/cgi/wiki?FirstClass
|title = First Class
|publisher = C2.com
|date = 2006-01-25
|archiveurl = https://www.webcitation.org/69BvhdKEL?url=http://www.c2.com/cgi/wiki?FirstClass
|archivedate = 2012-07-16
|accessdate = 2012-07-16
|deadlink = no
}}</ref><ref>{{cite web
|url = http://www.catalysoft.com/definitions/firstClassObject.html
|title = first class object
|publisher = Catalysoft.com
|date =
|accessdate = 2010-10-09
|archiveurl = https://www.webcitation.org/69inz2D9E?url=http://www.catalysoft.com/definitions/firstClassObject.html
|archivedate = 2012-08-06
|deadlink = no
}}</ref>:
* может быть сохранен в [[Переменная (программирование)|переменной]] или [[Структура данных|структурах данных]];
* может быть передан в [[Функция (программирование)|функцию]] как [[Параметр (программирование)|аргумент]];
* может быть возвращен из функции как результат;
* может быть создан во [[время выполнения]] программы;
* внутренне самоопознаваем (независим от именования).


Термин «объект» используется здесь в общем смысле и не ограничивается [[Объект (программирование)|объектами языка программирования]]. Так, значения простейших [[Тип данных|типов данных]], например, [[Целый тип|integer]] и [[Число с плавающей запятой|float]], во многих языках являются «объектами первого класса».
Объект называют «объектом первого класса» когда он<ref name="c2FirstClass">{{cite web
|url=http://www.c2.com/cgi/wiki?FirstClass
|title=First Class
|publisher=C2.com
|date=2006-01-25
|archiveurl=http://www.webcitation.org/69BvhdKEL
|archivedate=2012-07-16
|accessdate=2012-07-16}}</ref><ref>{{cite web
|url=http://www.catalysoft.com/definitions/firstClassObject.html
|title=first class object
|publisher=Catalysoft.com
|date=
|accessdate=2010-10-09}}</ref>:
* может быть сохранен в [[Переменная (программирование)|переменной]] или [[Структура данных|структурах данных]]
* может быть передан в [[Функция (программирование)|функцию]] как [[Параметр (программирование)|параметр]]
* может быть возвращен из функции как результат
* может быть создан во [[время выполнения]] программы
* внутренне самоидентифицируем (независим от именования)

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


== Примеры ==
== Примеры ==
В [[Си (язык программирования)|C]] и [[C++]] нельзя создавать функции во время выполнения программы, поэтому функции не являются объектами первого класса в этих языках. В то же время указатели на функцию можно передавать в качестве аргумента и возвращать из другой функции, поэтому иногда функции в C++ называют объектами второго класса ({{lang-en|second-class object}}). Тем не менее, в C++ есть понятие [[Функциональный объект|функционального объекта]] ({{lang-en|function object}}), который является объектом первого класса и реализует эквивалентную функциям семантику<ref name="c2FirstClass" />.


В [[Smalltalk]]<ref>{{Cite web |url=http://rosettacode.org/wiki/First-class_functions |title=First class functions in many programming languages (examples) |access-date=2012-07-21 |archive-date=2010-06-11 |archive-url=https://web.archive.org/web/20100611155449/http://rosettacode.org/wiki/First-class_functions |deadlink=no }}</ref> , [[Scala (язык программирования)|Scala]], и [[JavaScript]]<ref>{{Cite web |url=http://helephant.com/2008/08/19/functions-are-first-class-objects-in-javascript/ |title=Functions are first class objects in JavaScript |accessdate=2012-07-21 |archiveurl=https://web.archive.org/web/20120727042438/http://helephant.com/2008/08/19/functions-are-first-class-objects-in-javascript/ |archivedate=2012-07-27 |deadlink=yes }}</ref> функции (методы) и классы являются объектами первого класса. Поскольку операторы (<code>+</code>, <code>-</code>) в Smalltalk по сути методы, они также являются объектами первого класса.
В [[Си (язык программирования)|C]] и [[C++]] нельзя создавать функции во время выполнения программы, поэтому функции не являются объектами первого класса в этих языках. В то же время указатели на функцию можно передавать в качестве аргумента и возвращать из другой функции, поэтому иногда функции в C++ называют объектами второго класса ({{lang-en|second-class object}}). Тем не менее, в C++ есть понятие функционального объекта ({{lang-en|function object}}), который является объектом первого класса и реализует эквивалентную функциям семантику<ref name="c2FirstClass" />.


Пример кода на языке [[Nim]].<syntaxhighlight lang="nim">
В [[Smalltalk]]<ref>[http://rosettacode.org/wiki/First-class_functions First class functions in many programming languages (examples)]</ref> и [[JavaScript]]<ref>[http://helephant.com/2008/08/19/functions-are-first-class-objects-in-javascript/ Functions are first class objects in JavaScript]</ref> функции (методы) и классы являются объектами первого класса. Поскольку операторы (<code>+</code>, <code>-</code>) в Smalltalk суть методы, они также являются объектами первого класса.
# присвоим процедуру переменной
var value = proc() =
echo "value"


value() # вызов процедуры
== Примечания ==
var value2 = value
{{примечания}}
value2() # вызов процедуры


# процедура будет передана другой
proc two(): string =
return "two"


# процедура будет получать другую процедуру
{{compu-prog-stub}}
proc wrap(x: proc) =
echo "one"
echo x()
echo "three"


# вызов процедуры которая получает на вход другую процедуру
[[Категория:Объектно-ориентированное программирование]]
wrap(two)


# процедура, которая возвращает процедуру
[[cs:First-class objekt]]
proc closure(x: int): proc =
[[de:First-Class-Objekt]]
proc res(y:int): int =
[[en:First-class citizen]]
return y*y+x
[[fr:Objet de première classe]]
return res
[[ja:第一級オブジェクト]]

[[ko:일급 객체]]
var result = closure(2) # вызовем процедуру которая вернет другую процедуру
[[pl:Typ pierwszoklasowy]]
echo result(3) # вызов внутренней процедуры
[[uk:Об'єкт першого класу]]

[[zh:第一類物件]]
</syntaxhighlight>

== Примечания ==
{{примечания}}

[[Категория:Объектно-ориентированное программирование]]

Текущая версия от 09:43, 14 мая 2024

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