Что означает "объект первого класса"?

В недавнем вопросе я получил предложения поговорить, среди прочего, с аспектом JavaScript, где функции являются объектами "первого класса" . Что означает "первый класс" в этом контексте, в отличие от других объектов?

EDIT (Jörg W Mittag): Точный дубликат: "Что такое конструкция программирования первого класса?"

Ответ 1

Чтобы процитировать Wikipedia:

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

Эта страница также иллюстрирует ее красиво:

Действительно, как и любая другая переменная

  • Функция - это экземпляр типа объекта
  • Функция может иметь свойства и имеет ссылку на свой конструктор
  • Вы можете сохранить функцию в переменной
  • Вы можете передать функцию в качестве параметра другой функции
  • Вы можете вернуть функцию из функции

также читайте комментарий TrayMan, интересный...

Ответ 2

Понятие "первоклассных функций" на языке программирования было введено британским ученым-программистом Christopher Strachey в 1960-х годах. Наиболее известная формулировка этого принципа, вероятно, находится в Структура и интерпретация компьютерных программ Джеральд Джей Суссман и Гарри Абельсон:

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

В основном это означает, что вы можете делать с функциями все, что вы можете делать со всеми другими элементами на языке программирования. Таким образом, в случае JavaScript это означает, что все, что вы можете сделать с помощью Integer, String, Array или любого другого объекта Object, также можете выполнять с функциями.

Ответ 3

Более полное одобрение формулировки Стрэхи-Суссмана-Абельсона. Поэтому, если ваш язык поддерживает такую ​​конструкцию, у вас есть функция в качестве первоклассного языка:)

var men = function (objectOfAdmiration) {
  return objectOfAdmiration();
};
men.isSweetHeart = true;

var women = function (objectOfAdmiration) {
  return objectOfAdmiration();
};
women.isSweetHeart = true;

var aliens = function (objectOfAdmiration) {
  return objectOfAdmiration();
};

function like(obj){
  if (obj.isSweetHeart) {
      return function (){ return "Holy TRUE!"}; 
  }
  else {
      return function (){ return "Holy CRAP!"};
  }
}

alert("Men like women is " + men(like(women))); // -> "Holly TRUE!"
alert("Women like men is " + women(like(men))); // -> "Holly TRUE!"

alert("Men like aliens is " + men(like(aliens))); // -> "Holly CRAP!"
alert("Aliens like women is " + aliens(like(women))); // -> "Holly TRUE!" :)

//women(like(aliens)); //  Who knows? Life is sometimes so unpredictable... :)

Короче говоря, что-то является объектом первого класса, если он действует на языке как объект управления объектом или тип объекта. Просто что-то, что вы можете оперировать и обрабатывать заявления и оценивать в выражениях одновременно. Или даже короче: когда вы можете думать о функции как об объекте, который может быть дополнительно вызван.

Ответ 4

Функции JavaScript являются первоклассными функциями, означающими, что функции и объекты рассматриваются как одно и то же. Функции могут быть сохранены как переменная внутри объекта или массива, а также могут быть переданы в качестве аргумента или возвращены другой функцией. Это делает функцию "первоклассных граждан в JavaScript"

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

Например..

var youObj1 = new Object();
// or
var youObj1 = {};

оба declerations эквивалентны. Используя new, мы вызываем функцию-конструктор объекта. Кроме того, используя {} (ярлык JavaScript, называемый литералами), мы вызываем функцию построения объекта. {} является просто более коротким представлением для экземпляра конструктора.

В большинстве языков для создания объекта используется new ключевое слово , поэтому можно создать объект JavaScript.

var myFunction = new Function("a",  "b", 'return a_b');

Как вы видите, мы создали имя объекта .

Создание той же функции имени объекта с использованием выражения функции JavaScript..

var myFunction = function myFunction(a,b) {
    return a+b;
}

Здесь мы просто создали функцию имени объекта.

Ответ 5

В javascript функции являются объектами первого класса, потому что они могут делать намного больше, чем объекты.

  • Функция - это экземпляр типа объекта.

Function instanceof Object //returns true

Как и объект, функция может иметь свойства и может ссылаться на свою конструкторскую функцию.

 var o = {}; // empty object 'o'
    o.a = 1 ; 
    o.b = 2 ; 

    console.log(o.a); // 1
    console.log(o.b); // 2 


    function foo(){};
    foo.a = 3 ; 
    foo.b = 4 ; 

    console.log(foo.a);  // logs 3
    console.log(foo.b);  // logs 4 

Ответ 6

Простой тест. Если вы можете сделать это на своем языке (пример Python):

def double(x):
    return x*x

f = double

print f(5) #prints 25

Ваш язык обрабатывает функции как объекты первого класса.

Ответ 7

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

Ответ 8

Это означает, что функция фактически наследует объект. Чтобы вы могли передавать его и работать с ним, как с любым другим объектом.

В С# однако вам нужно воздерживаться от делегатов или размышлений, чтобы играть с функциями. (в последнее время это заметно улучшилось с лямбда-выражениями)

Ответ 9

Я предполагаю, что когда что-то является первым классом на языке, это означает, что он поддерживается его синтаксисом, а не библиотекой или синтаксическим сахаром. например, классы в C не являются первоклассными