Что такое объекты "первого класса"? - PullRequest
164 голосов
/ 29 октября 2008

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

EDIT. Когда кто-то говорит «все является объектом» (как в Python), он действительно подразумевает, что «все первоклассно»?

Ответы [ 5 ]

146 голосов
/ 29 октября 2008

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

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

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

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

Источник .

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

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

В C ++ классы - это не объекты первого класса, а экземпляры этих классов. В 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

Источник .

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

Относительно редактирования:

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

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

18 голосов
/ 29 октября 2008

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

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

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

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

17 голосов
/ 06 января 2009

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

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

  • Для именования переменными.
  • Для передачи в качестве аргументов процедурам.
  • Возвращается в качестве значений процедур.
  • Для включения в структуры данных
16 голосов
/ 29 октября 2008

«Когда кто-то говорит« все является объектом »(как в 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 как первоклассные типы. Это может быть трудно преподавать новичкам - не очевидно, почему и примитивный тип, и класс должны существовать бок о бок.

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

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

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

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

>>> type(type(2))
<type 'type'>
2 голосов
/ 29 октября 2008

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...