Коли об'єкти чи щось інше називають "першокласним" у даній мові програмування, і чому? Чим вони відрізняються від мов, де їх немає?
EDIT. Коли хтось каже "все є об'єктом" (як у Python), чи справді він означає, що "все є першокласним"?
Коли об'єкти чи щось інше називають "першокласним" у даній мові програмування, і чому? Чим вони відрізняються від мов, де їх немає?
EDIT. Коли хтось каже "все є об'єктом" (як у Python), чи справді він означає, що "все є першокласним"?
Відповіді:
Якщо коротко, це означає, що немає обмежень у використанні об'єкта. Це те саме, що і будь-який інший об’єкт.
Об'єкт першого класу - це сутність, яку можна динамічно створювати, знищувати, передавати у функції, повертати як значення та мати всі права, як і інші змінні в мові програмування.
Залежно від мови це може означати:
- бути вираженим як анонімне буквальне значення
- зберігаються у змінних
- зберігаються в структурах даних
- мати внутрішню ідентичність (незалежно від будь-якого імені)
- порівняння рівності з іншими суб'єктами
- бути прохідним як параметр до процедури / функції
- повернення в результаті процедури / функції
- будується конструкційним під час виконання
- під час друку
- бути читабельним
- переноситься між розподіленими процесами
- зберігаються поза запущеними процесами
Джерело .
Однак у 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 вони прагнуть зробити все першокласним. Я вважаю, що наміри людини, яка зробила вашу заяву, означала перший клас.
"Коли хтось каже" все є об'єктом "(як у 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'>
int
. Таким чином, "старий" проти "класів нового стилю" (і в 3-х класах старого стилю вже немає).
"Перший клас" означає, що ви можете керувати ними звичайним чином. У більшості випадків це просто означає, що ви можете передати цих громадян першого класу як аргументи до функцій або повернути їх з функцій.
Це зрозуміло для об'єктів, але не завжди так очевидно для функцій або навіть класів:
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 - константи).
З слайду « Структура та інтерпретація комп’ютерних програм» , лекція 2А (1986), яка по черзі цитує Крістофера Стрійсі :
Права та привілеї громадян першого класу:
ІМО - це одна з тих метафор, що використовуються для опису речей природною мовою. Термін по суті використовується в контексті опису функцій як об'єктів першого класу.
Якщо ви розглядаєте об'єктно-орієнтовану мову, ми можемо надати об'єктам різні функції, наприклад: успадкування, визначення класу, можливість передачі до інших розділів коду (аргументи методу), можливість зберігання в структурі даних тощо. Якщо ми можемо зробити так само з сутністю, яке зазвичай не розглядається як об'єкт, подібно до функцій у випадку сценарію java, такі об'єкти вважаються об'єктами першого класу.
Перший клас по суті тут означає, що не розглядається як другий клас (з деградованою поведінкою). По суті, глузування є ідеальним або нерозрізненим.