什么是“一stream”对象?

什么时候在给定的编程语言中,对象或别的东西被称为“第一类”,为什么? 他们与哪些语言不同?

编辑。 当一个人说“一切都是对象”时(比如在Python中),他是否确实是指“一切都是一stream的”?

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

第一个类对象是一个实体,可以被dynamic地创build,销毁,传递给一个函数,作为一个值返回,并具有编程语言中其他variables的所有权限。

根据不同的语言,这可能意味着:

  • 可以expression为一个匿名的字面值
  • 可存储在variables中
  • 可存储在数据结构中
  • 具有内在的身份(独立于任何给定的名字)
  • 与其他实体平等相比
  • 作为过程/function的参数是可通过的
  • 作为程序/function的结果可退还
  • 在运行时可以被构造
  • 可打印
  • 可读性
  • 可以在分布式进程之间传输
  • 在运行过程之外可以存储

来源 。

在C ++中,函数本身不是头等对象,但是:

  • 你可以重载'()'操作符,使其有可能具有一个对象函数,这是一stream的。
  • 函数指针是一stream的。
  • boost绑定,lambda和函数提供了一stream的function

在C ++中,类不是第一类对象,而是这些类的实例。 在Python中,类对象都是第一类对象。 (有关作为对象的类的更多详细信息,请参阅此答案 )。

这是一个Javascript的第一类function的例子:

// 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 ++中的函数是第二类,因为它们不能dynamic创build。

关于编辑:

编辑。 当一个人说“一切都是对象”时(比如在Python中),他是否确实是指“一切都是一stream的”?

术语对象可以松散地使用,并不意味着成为头等舱。 将整个概念称为“头等实体”可能更有意义。 但是在Python中,他们的目标是把所有东西都做成一stream的。 我相信发言人的意图意味着一stream。

“头等舱”意味着你可以用通常的方式对他们进行操作。 大多数时候,这只意味着你可以把这些一stream的公民作为parameter passing给function,或者从function中返回。

这对于客体来说是不言而喻的,但对于function甚至是阶级而言,并不总是那么明显:

 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,甚至可以把类和代码块当作普通variables(或者Ruby,常量)来处理。

“当一个人说”一切都是对象“时(比如在Python中),他是否确实是指”一切都是一stream的“?

是。

Python中的所有东西都是适当的对象。 即使是其他语言中的“原始types”的东西。

你发现像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中的所有东西都是一stream的对象,所以有相当less的特殊情况。

例如,在Java中,存在不适合的对象的原始types(int,bool,double,char)。 这就是为什么Java必须引入Integer,Boolean,Double和Character作为第一类types。 对于初学者来说这可能很难教导 – 为什么原始types和类必须并排存在是不明显的。

这也意味着一个对象的类本身就是一个对象。 这与C ++不同,C ++在运行时并不总是有明确的存在。

2type 'int'type 'int'对象,它具有方法,属性和types。

 >>> type(2) <type 'int'> 

int这样的内置type 'type'type 'type'对象。 这也有方法和属性。

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

从计算机程序的结构和解释的幻灯片,讲座第2A(1986),引用克里斯托弗Stracey :

一等公民的权利和特权:

  • 被variables命名。
  • 作为parameter passing给程序。
  • 作为程序的值返回。
  • 被纳入数据结构

IMO是用自然语言描述事物的隐喻之一。 该术语主要用于描述函数作为第一类对象的上下文中。

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

这里的第一类基本上是指,不作为第二类处理(具有退化的行为)。 本质上,嘲笑是完美的或无法区分的。