当前位置:  开发笔记 > 编程语言 > 正文

什么是"头等"对象?

如何解决《什么是"头等"对象?》经验,为你挑选了4个好方法。

什么时候对象或其他东西在给定的编程语言中被称为"第一类",为什么?他们与不同的语言有什么不同?

编辑.当一个人说"一切都是对象"时(比如Python),他的确意味着"一切都是一流的"吗?



1> Brian R. Bon..:

简而言之,这意味着对象的使用没有任何限制.它与任何其他对象相同.

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

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

可表达为匿名字面值

可存储在变量中

可存储在数据结构中

具有内在身份(独立于任何给定名称)

与其他实体的平等可比

可作为参数传递给过程/函数

由于程序/功能而可以返回

在运行时可构造

可打印的

可读

在分布式流程中可传输

在运行过程中可以存储

来源.

在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++中的函数是第二类,因为它们无法动态创建.

关于编辑:

编辑.当一个人说"一切都是对象"时(比如Python),他的确意味着"一切都是一流的"吗?

术语对象可以松散地使用,并不意味着是一流的.将整个概念称为"第一类实体"可能更有意义.但在Python中,他们的目标是让一切都变得一流.我相信发表声明的人的意图意味着头等舱.


你能举出一些不是"头等"的对象的例子吗?

2> Konrad Rudol..:

"头等舱"意味着您可以通常的方式操作它们.大多数情况下,这只意味着您可以将这些一等公民作为函数的参数传递,或者从函数中返回它们.

这对于对象来说是不言而喻的,但对于函数甚至类来说并不总是那么明显:

void f(int n) { return n * 2; }

void g(Action a, int n) { return a(n); }

// Now call g and pass f:

g(f, 10); // = 20

这是C#中的一个示例,其中函数实际上不是第一类对象.因此,上面的代码使用一个小的变通方法(即一个被调用的泛型委托Action<>)来传递函数作为参数.其他语言(如Ruby)允许将类和代码块视为普通变量(或者在Ruby,常量的情况下).



3> S.Lott..:

"当一个人说"一切都是对象"时(比如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++在运行时并不总是具有明显的存在.

对象的类型2type 'int'具有方法,属性和类型的对象.

>>> type(2)

类似于内置类型inttype 'type'对象.这也有方法和属性.

>>> type(type(2))



4> Federico A. ..:

从结构和计算机程序解释的幻灯片,讲座2A(1986),其中引用Christopher Stracey:

一等公民的权利和特权:

由变量命名.

作为参数传递给程序.

作为程序的值返回.

要合并到数据结构中

推荐阅读
oDavid_仔o_880
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有