Объект первого класса: различия между версиями
[отпатрулированная версия] | [отпатрулированная версия] |
РоманСузи (обсуждение | вклад) м викификация |
Gromolyak (обсуждение | вклад) м →Примеры Метки: с мобильного устройства через мобильное приложение через приложение для Android |
||
(не показано 30 промежуточных версий 19 участников) | |||
Строка 1: | Строка 1: | ||
'''Объектами первого класса''' ( |
'''Объектами первого класса''' ({{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>. |
|||
== Определение == |
== Определение == |
||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
|deadlink = no |
|||
}}</ref><ref>{{cite web |
|||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
|archiveurl = https://www.webcitation.org/69inz2D9E?url=http://www.catalysoft.com/definitions/firstClassObject.html |
|||
|archivedate = 2012-08-06 |
|||
|deadlink = no |
|||
}}</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> |
||
# присвоим процедуру переменной |
|||
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) # вызов внутренней процедуры
Примечания
[править | править код]- ↑ Scott, Michael. Programming Language Pragmatics (неопр.). — San Francisco, CA: Morgan Kaufmann Publishers, 2006. — С. 140.
- ↑ Rod Burstall, «Christopher Strachey—Understanding Programming Languages», Higher-Order and Symbolic Computation 13:52 (2000) . Дата обращения: 2 ноября 2013. Архивировано из оригинала 12 августа 2017 года.
- ↑ 1 2 First Class . C2.com (25 января 2006). Дата обращения: 16 июля 2012. Архивировано 16 июля 2012 года.
- ↑ first class object . Catalysoft.com. Дата обращения: 9 октября 2010. Архивировано 6 августа 2012 года.
- ↑ First class functions in many programming languages (examples) . Дата обращения: 21 июля 2012. Архивировано 11 июня 2010 года.
- ↑ Functions are first class objects in JavaScript . Дата обращения: 21 июля 2012. Архивировано из оригинала 27 июля 2012 года.