Answers:
定义
对象在以下情况下是一流的:
- 可以存储在变量和数据结构中
- 可以作为参数传递给子例程
- 可以作为子例程的结果返回
- 可以在运行时构造
- 具有固有身份(与任何给定名称无关)
术语“对象”在这里被宽松地使用,不必在面向对象的编程中指代对象。最简单的标量数据类型(例如整数和浮点数)几乎总是一流的。
编程语言中的“一流公民”或“一流元素”的概念是由英国计算机科学家克里斯托弗·斯特拉奇(Christopher Strachey)于1960年代在一流功能的背景下提出的。该原理最著名的提法可能是杰拉尔德·杰伊·萨斯曼和哈里·阿贝尔森的《计算机程序的结构和解释》:
- 它们可以用变量命名。
- 它们可以作为参数传递给过程。
- 它们可能作为程序的结果返回。
- 它们可能包含在数据结构中。
基本上,这意味着您可以使用该编程语言元素来完成您可以使用该编程语言中的所有其他元素来进行的所有操作。
这一切都是关于“平等权利”的:您可以用整数来完成上述所有工作,那么为什么其他任何东西都应该有所不同呢?
上面的定义在某种意义上是有限制的,因为它仅真正涉及与作为程序对象有关的一流性。一个更笼统的定义是,如果您可以用一件事情做所有事情,那么您也可以用其他同类的事情做一件一流的事情。
例如,Java运算符和Java方法是类似的类型。您可以定义新方法,可以(某种程度上)自由选择自己方法的名称,可以覆盖方法,可以重载方法。詹姆斯·高斯林(James Gosling)也可以通过操作员来完成所有这些工作,但是您和我却做不到。我的意思是,流行的看法相反,Java的不支持运算符重载:例如,+
运营商目前超载byte
,short
,int
,long
,float
,double
和String
,和IIRC Java 7中也BigInteger
和BigDecimal
(也许几个我忘了),它只是你对它没有任何影响。显然,这使操作员根据第二个定义成为第二等。请注意,根据第一个定义,方法仍然不是一流的对象。(这使操作员成为第三流吗?)
通常,这是指可以作为参数传递,可以定义为函数的返回类型或可以分配值的构造。通常,您需要能够在运行时构造它们。例如,一个类的实例在c ++或java中将是一等公民,而在C中的函数则不是。
我想说的是,如果仅通过语言实现某项功能,则它就是一流的公民。
也就是说,它不需要多种语言功能或标准库即可实现该功能。
例:
在C / C ++中,我不认为函数是一等公民(其他人可能是)。
这是因为有一些方法可以操纵语言直接支持的功能,但需要使用其他语言功能。不直接支持将参数绑定到函数,并且您必须构建函子才能实现此功能。