Я много раз видел такие высказывания, как: «Пожалуйста, сделайте эту функцию первоклассным гражданином на том или ином языке / платформе». Например, говорится о перечислениях в C # /. Net. Итак, когда функция считается «гражданином первого класса» на языке программирования / платформе?
language-features
Gulshan
источник
источник
Понятие «первоклассный гражданин» или «первоклассный элемент» в языке программирования было введено британским ученым Кристофером Стрейчи в 1960-х годах в контексте первоклассных функций. Наиболее известная формулировка этого принципа, вероятно, содержится в « Структуре и интерпретации компьютерных программ » Джеральда Джея Суссмана и Гарри Абельсона:
По сути, это означает, что вы можете делать с этим элементом языка программирования все, что вы можете делать со всеми другими элементами в языке программирования.
Все дело в «равных правах»: вы можете делать все вышеперечисленное, скажем, с целыми числами, так почему же любая другая вещь должна отличаться?
Вышеприведенное определение немного ограничительно в том смысле, что оно действительно говорит только об аспекте первоклассности, связанном с тем, чтобы быть объектами программы. Более общим определением будет то, что вещь является первоклассной, если вы можете делать с ней все, что вы можете делать с другими вещами подобного рода.
Например, операторы Java и методы Java имеют сходный вид. Вы можете определять новые методы, вы можете (несколько) свободно выбирать имена своих собственных методов, вы можете переопределять методы, вы можете перегружать методы. Джеймс Гослинг тоже может делать все это с операторами, но мы с тобой не можем. Я имею в виду, вопреки распространенному мнению, Java делает перегрузку оператора поддержки: например,
+
оператор перегруженbyte
,short
,int
,long
,float
,double
иString
, и IIRC в Java 7 такжеBigInteger
иBigDecimal
(и , возможно, пара я забыл), это просто , что вамне иметь никакого влияния на это. Это явно делает операторов второсортными в соответствии с этим вторым определением. Обратите внимание, что методы по-прежнему не являются первоклассными объектами согласно первому определению. (Делает ли это операторы третьего класса?)источник
Обычно это относится к конструкции, которая может быть передана в качестве параметра, может быть определена как тип возврата из функции или ей может быть присвоено значение. Обычно вы должны быть в состоянии построить их во время выполнения. Например, экземпляр класса будет гражданином первого класса в c ++ или java, но функция в C не будет.
источник
Я бы сказал, что функция является первоклассным гражданином, если она реализована исключительно на языке.
т. е. для его реализации не требуется наличие нескольких языковых функций или стандартной библиотеки.
Пример:
В C / C ++ я не считаю функции гражданином первого класса (другие могут).
Это потому, что есть способы манипулировать функциями, которые напрямую поддерживаются языком, но требуют использования других языковых функций. Привязка параметров к функции напрямую не поддерживается, и вы должны создать функтор для реализации этой функции.
источник
Чтобы добавить пример к уже предоставленным ответам:
В WCF / C # вы должны пометить объект класса атрибутом контракта на обслуживание, чтобы он работал как сервис. Нет такой вещи как:
Класс - это первоклассный гражданин в c #, где нет службы.
Надеюсь это поможет
источник