对象或其他什么东西在给定的编程语言中被称为“头等”,为什么?他们与不同的语言有何不同?
EDIT。当一个人说“一切都是对象”时(比如Python),他的确意味着“一切都是一流的”吗?
答案 0 :(得分:146)
简而言之,这意味着对象的使用没有任何限制。它是一样的 任何其他对象。
第一类对象是可以动态创建,销毁,传递给函数,作为值返回,并具有编程语言中其他变量的所有权限的实体。
根据语言,这可以 意味着:
- 可表达为匿名字面值
- 可存储变量
- 可存储在数据结构中
- 具有内在身份(独立于任何给定名称)
- 与其他实体的平等可比性
- 可作为参数传递给过程/函数
- 作为程序/功能的结果可以返回
- 在运行时可构建
- 可打印
- 可读
- 可在分布式流程中传播
- 可以在运行过程之外存储
在C ++函数中,它们本身不是第一类对象,但是:
在C ++中,类不是第一类对象,而是这些类的实例。在Python中,对象类和都是第一类对象。 (有关作为对象的类的更多详细信息,请参阅this answer。
以下是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中,他们的目标是让一切都变得一流。我相信发表声明的人的意图意味着头等舱。
答案 1 :(得分:18)
“头等舱”意味着您可以通常的方式操作它们。大多数情况下,这只意味着您可以将这些一等公民作为函数的参数传递,或者从函数中返回它们。
这对于对象来说是不言而喻的,但对于函数甚至类来说并不总是那么明显:
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 :(得分:17)
从Structure and Interpretation of Computer Programs的幻灯片,讲座2A(1986),其中引用Christopher Stracey:
一等公民的权利和特权:
答案 3 :(得分:16)
“当一个人说”一切都是对象“时(比如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必须引入Integer,Boolean,Double和Character作为一流类型的原因。这对初学者来说很难教 - 为什么原始类型和类都必须并排存在并不明显。
这也意味着对象的类本身就是一个对象。这与C ++不同,在C ++中,类在运行时并不总是存在明显的存在。
2
的类型是type 'int'
对象,它有方法,属性和类型。
>>> type(2)
<type 'int'>
int
等内置类型的类型是type 'type'
对象。这也有方法和属性。
>>> type(type(2))
<type 'type'>
答案 4 :(得分:2)
IMO这是用于用自然语言描述事物的隐喻之一。该术语主要用于将函数描述为第一类对象的上下文中。
如果考虑面向对象的语言,我们可以为对象赋予各种功能,例如:继承,类定义,传递给代码的其他部分的能力(方法参数),存储在数据结构中的能力等。如果我们可以对通常不被视为对象的实体做同样的事情,就像java脚本中的函数一样,这些实体被认为是第一类对象。
第一类基本上在这里意味着,不作为第二类处理(具有降级行为)。基本上,嘲笑是完美的或难以区分的。