什么是“一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 ++在运行时并不总是有明确的存在。
2
的type '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脚本中的函数一样,这样的实体被认为是第一类对象。
这里的第一类基本上是指,不作为第二类处理(具有退化的行为)。 本质上,嘲笑是完美的或无法区分的。