Що таке "першокласні" об'єкти?


191

Коли об'єкти чи щось інше називають "першокласним" у даній мові програмування, і чому? Чим вони відрізняються від мов, де їх немає?

EDIT. Коли хтось каже "все є об'єктом" (як у Python), чи справді він означає, що "все є першокласним"?


1
Чи можна було б перенести це питання на програмістів.SE? Або це теж буде недоречним? Я думаю, що це питання добре. Просто не в змозі сказати, який форум найкраще підійде.
Шашанк Сован

16
Проголосували за повторне відкриття ... На жаль, це справді здається, що його закрили люди, які не програмують, це чітко на тему: /
djechlin

Відповіді:


176

Якщо коротко, це означає, що немає обмежень у використанні об'єкта. Це те саме, що і будь-який інший об’єкт.

Об'єкт першого класу - це сутність, яку можна динамічно створювати, знищувати, передавати у функції, повертати як значення та мати всі права, як і інші змінні в мові програмування.

Залежно від мови це може означати:

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

Джерело .

Однак у C ++ функції не є першокласними об'єктами:

  • Ви можете змінити оператор '(), що дає можливість функціонувати об'єкту, який є першим класом.
  • Функціональні покажчики - це перший клас.
  • посилення прив'язки, лямбда та функції пропонують функції першого класу

У 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 вони прагнуть зробити все першокласним. Я вважаю, що наміри людини, яка зробила вашу заяву, означала перший клас.


2
Чи можете ви навести кілька прикладів об'єктів, які не є «першокласними»?
Судіп Бхандарі

1
@SudipBhandari Я задумався про те саме, нарешті натрапивши на корисну статтю Вікіпедії на цю тему: громадянин / об'єкт першокласного класу . Я визнав визначення Робіна Попплстоуна особливо корисним. (Btw, розміщення статті WP може здатися надзвичайно очевидним, але я не усвідомлював, що це була основна концепція мови програмування)
mblakesley

19

"Коли хтось каже" все є об'єктом "(як у 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 має представити цілі, булеві, подвійні та символи як першокласні типи. Це може бути важко навчити початківцям - не очевидно, чому і примітивний тип, і клас повинні існувати поруч.

Це також означає, що клас об'єкта - сам - об'єкт. Це відрізняється від C ++, де класи не завжди мають чітке існування під час виконання.

Тип 2- це type 'int'об'єкт, який має методи, атрибути та тип.

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

Тип вбудованого типу типу intє type 'type'об'єктом. У цьому є також методи та ознаки.

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

1
Це стосується сучасного Python. У старому Python (версія 1? Це було до мого часу) ви не могли успадкувати int. Таким чином, "старий" проти "класів нового стилю" (і в 3-х класах старого стилю вже немає).
Кіт Пінсон

17

"Перший клас" означає, що ви можете керувати ними звичайним чином. У більшості випадків це просто означає, що ви можете передати цих громадян першого класу як аргументи до функцій або повернути їх з функцій.

Це зрозуміло для об'єктів, але не завжди так очевидно для функцій або навіть класів:

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

З слайду « Структура та інтерпретація комп’ютерних програм» , лекція 2А (1986), яка по черзі цитує Крістофера Стрійсі :

Права та привілеї громадян першого класу:

  • Називати змінними.
  • Доводиться передавати як аргументи до процедур.
  • Повертається як значення процедур.
  • Включити в структури даних

1

ІМО - це одна з тих метафор, що використовуються для опису речей природною мовою. Термін по суті використовується в контексті опису функцій як об'єктів першого класу.

Якщо ви розглядаєте об'єктно-орієнтовану мову, ми можемо надати об'єктам різні функції, наприклад: успадкування, визначення класу, можливість передачі до інших розділів коду (аргументи методу), можливість зберігання в структурі даних тощо. Якщо ми можемо зробити так само з сутністю, яке зазвичай не розглядається як об'єкт, подібно до функцій у випадку сценарію java, такі об'єкти вважаються об'єктами першого класу.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.