什么是“第一流”;对象?

什么时候物体或其他东西被说成是“第一流的”;在给定的编程语言中,为什么?它们与其他语言有什么不同?

当一个人说“万物皆物”时;(就像在Python中一样),它们真的意味着“一切都是一流的”吗?

76697 次浏览

简而言之,它意味着对对象的使用没有限制。这和 任何其他对象。

第一类对象是一种实体,可以动态地创建、销毁、传递给函数、作为值返回,并具有编程语言中其他变量所具有的所有权限。

取决于语言,这可以 暗示:< / p >

  • 可表示为匿名文字值
  • 可存储在变量中
  • 可存储在数据结构中
  • 具有内在的同一性(独立于任何给定的名称)
  • 可与其他实体相等的
  • 可作为参数传递给过程/函数
  • 可返回的作为过程/函数的结果返回的
  • 在运行时可构造
  • 被打印出来
  • 是可读的
  • 可在分布式进程之间传输
  • 可存储在正在运行的进程之外

在c++中,函数本身并不是第一类对象,但是:

  • 你可以重写'()'操作符,使它有可能有一个对象函数,这是第一类。
  • 函数指针是第一流的。
  • Boost bind, lambda和function确实提供了第一类函数

在c++中,类不是第一类对象,而是这些类的实例。在Python中,两个类而且和对象都是第一类对象。(有关类作为对象的更多细节,请参阅这个答案)。

下面是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++中的函数是第二类,因为它们不能动态创建。

关于编辑:

< p >编辑。当一个人说“一切都是。 一个对象”(就像在Python中一样) 的确意味着“一切都是” 一流的”?< / p >

术语对象可以宽泛地使用,并不意味着是第一流的。将整个概念称为“第一类实体”可能更有意义。但是在Python中,他们的目标是使所有东西都是一流的。我相信对你说话的人的意图是一流的。

“一流”的意思是你可以用通常的方式操作它们。大多数时候,这只是意味着你可以将这些一级公民作为参数传递给函数,或者从函数返回它们。

这对于对象来说是不言自明的,但对于函数,甚至类来说并不总是如此明显:

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或Python,甚至允许将类和代码块视为普通变量(或者在Ruby的情况下,常量)。

在我看来,这是自然语言中用来描述事物的隐喻之一。该术语本质上用于将函数描述为第一类对象的上下文中。

如果考虑面向对象语言,我们可以赋予对象各种特性,例如:继承、类定义、传递到其他代码段的能力(方法参数)、存储在数据结构中的能力等。如果我们可以对一个通常不被认为是对象的实体做同样的事情,就像java脚本中的函数一样,这样的实体被认为是第一类对象。

这里的第一类本质上是指不作为第二类处理(具有降级行为)。本质上,嘲讽是完美的或难以区分的。

当一个人说“一切都是一个对象”(就像在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)
<class 'int'>

内置类型(如int)的类型是type 'type'对象。它也有方法和属性。

>>> type(type(2))
<class 'type'>

来自计算机程序的结构与解释“,的一张幻灯片,2A(1986),其中引用了克里斯托弗Stracey:

一等公民的权利和特权:

  • 由变量命名。
  • 作为参数传递给过程。
  • 作为过程的值返回。
  • 被合并到数据结构中