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