Что такое объекты первого класса?

Когда объекты или что-то еще называются "первоклассниками" на данном языке программирования и почему? В чем они отличаются от языков, где они не являются?

ИЗМЕНИТЬ. Когда кто-то говорит "все есть объект" (как в Python), действительно ли он означает, что "все первоклассно"?

Ответ 1

Короче говоря, это означает, что нет ограничений на использование объекта. Это то же самое, что и любой другой объект.

Объект первого класса - это объект, который может быть динамически создан, уничтожен, передан функции, возвращен как значение и имеет все права, как и другие переменные на языке программирования.

В зависимости от языка это может означает:

  • выражается как анонимное литеральное значение
  • сохраняется в переменных
  • можно хранить в структурах данных
  • с внутренним идентификатором (независимо от любого имени)
  • сопоставим для равенства с другими объектами
  • является допустимым как параметр процедуры/функции
  • является возвращаемым в результате процедуры/функции
  • является конструктивным во время выполнения
  • для печати
  • является удобочитаемым
  • передается среди распределенных процессов
  • сохраняемые внешние запущенные процессы

Источник.

В С++ функции сами по себе не являются объектами первого класса:

  • Вы можете переопределить оператор '()', позволяющий иметь объектную функцию, которая является первым классом.
  • Указатели функций являются первоклассными.
  • boost bind, лямбда и функция предлагают функции первого класса.

В С++ классы не являются объектами первого класса, но экземпляры этих классов. В Python оба класса и объекты являются объектами первого класса. (См. этот ответ для получения более подробной информации о классах как объектах).

Вот пример функций первого класса Javascript:

// f: function that takes a number and returns a number
// deltaX: small positive number
// returns a function that is an approximate derivative of f
function makeDerivative( f, deltaX )
{
    var deriv = function(x)
    { 
       return ( f(x + deltaX) - f(x) )/ deltaX;
    }
    return deriv;
}
var cos = makeDerivative( Math.sin, 0.000001);
// cos(0)     ~> 1
// cos(pi/2)  ~> 0

Источник.

Объекты, которые не являются объектами первого класса, называются объектами второго класса. Функции на С++ - это второй класс, потому что они не могут быть динамически созданы.

Что касается редактирования:

ИЗМЕНИТЬ. Когда говорят: "все объект" (например, в Python), делает ли он действительно означает, что "все первый класс"?

Термин объект может использоваться свободно и не означает, что он является первым классом. И, вероятно, было бы разумнее назвать всю концепцию "сущности первого класса". Но в Python они стремятся сделать все в первом классе. Я считаю, что намерение человека, сделавшего ваше выражение, означало первый класс.

Ответ 2

"Первый класс" означает, что вы можете работать с ними обычным способом. В большинстве случаев это означает, что вы можете передать этих первоклассных граждан в качестве аргументов в функции или вернуть их из функций.

Это самоочевидно для объектов, но не всегда так очевидно для функций или даже классов:

void f(int n) { return n * 2; }

void g(Action<int> a, int n) { return a(n); }

// Now call g and pass f:

g(f, 10); // = 20

Это пример в С#, где функции фактически не являются первоклассными объектами. Таким образом, в приведенном выше коде используется небольшое обходное решение (а именно общий делегат с именем Action<>) для передачи функции в качестве аргумента. Другие языки, такие как Ruby, позволяют рассматривать даже классы и кодовые блоки как обычные переменные (или в случае Ruby, константы).

Ответ 3

"Когда кто-то говорит" все есть объект "(как в Python), действительно ли он означает, что" все первоклассно "?

Да.

Все в Python - это правильный объект. Даже вещи, которые являются "примитивными типами" на других языках.

Вы обнаружите, что такой объект, как 2, имеет довольно богатый и сложный интерфейс.

>>> dir(2)
['__abs__', '__add__', '__and__', '__class__', '__cmp__', '__coerce__', '__delattr__', '__div__', '__divmod__', '__doc__', '__float__', '__floordiv__', '__getattribute__', '__getnewargs__', '__hash__', '__hex__', '__index__', '__init__', '__int__', '__invert__', '__long__', '__lshift__', '__mod__', '__mul__', '__neg__', '__new__', '__nonzero__', '__oct__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdiv__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__str__', '__sub__', '__truediv__', '__xor__']

Поскольку все объекты первоклассного класса на Python, существует относительно небольшое количество неясных особых случаев.

В Java, например, существуют примитивные типы (int, bool, double, char), которые не являются надлежащими объектами. Поэтому Java должен вводить Integer, Boolean, Double и Character в качестве первоклассных типов. Это может быть трудно учить новичкам - неясно, почему и примитивный тип, и класс должны существовать бок о бок.

Это также означает, что класс объекта - сам - объект. Это отличается от С++, где классы не всегда имеют четкое существование во время выполнения.

Тип 2 - это объект type 'int', который имеет методы, атрибуты и тип.

>>> type(2)
<type 'int'>

Тип встроенного типа типа int - это объект type 'type'. Это также методы и атрибуты.

>>> type(type(2))
<type 'type'>

Ответ 4

Из слайда в Структура и интерпретация компьютерных программ, лекция 2A (1986), которая, по очереди, цитирует Кристофер Стрэси:

Права и привилегии первоклассных граждан:

  • Имена переменных.
  • Для передачи аргументов в процедуры.
  • Для возврата в качестве значений процедур.
  • Чтобы быть включенным в структуры данных

Ответ 5

ИМО это одна из тех метафор, которые используются для описания вещей на естественном языке. Этот термин по существу используется в контексте описания функций как объектов первого класса.

Если вы рассматриваете объектно-ориентированный язык, мы можем передать различные объекты объектам, например: наследование, определение класса, способность перейти к другим разделам кода (аргументы метода), способность хранить в структуре данных и т.д. Если мы может сделать то же самое с сущностью, которая обычно не рассматривается как объект, как функции в случае java script, такие объекты считаются объектами первого класса.

Первый класс по существу здесь означает, что он не обрабатывается как второй класс (с ухудшенным поведением). По сути, насмешка совершенна или неразличима.