什么是“第一类”对象?

jhkqcmku  于 2021-06-26  发布在  Java
关注(0)|答案(5)|浏览(374)

在给定的编程语言中,对象或其他对象何时被称为“第一类”,为什么?它们与非它们的语言有什么不同?
编辑。当一个人说“一切都是一个对象”(就像在python中),他真的是说“一切都是一流的”吗?

xj3cbfub

xj3cbfub1#

“头等舱”是指你可以用通常的方式操作它们。大多数时候,这只是意味着可以将这些一级公民作为参数传递给函数,或者从函数返回它们。
这对于对象来说是不言而喻的,但对于函数,甚至是类来说并不总是如此明显:

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中是常量)。

sr4lhrrt

sr4lhrrt2#

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

内置类型的类型,如 inttype 'type' 对象。这也有方法和属性。

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

3mpgtkmj3#

摘自《计算机程序的结构和解释》第2a讲(1986年),其中依次引用了克里斯托弗·斯特雷西的话:
一等公民的权利和特权:
以变量命名。
作为参数传递给过程。
作为程序的值返回。
纳入数据结构

368yc8dk

368yc8dk4#

简而言之,它意味着对对象的使用没有限制。它和其他物体一样。
第一类对象是一个实体,它可以动态地创建、销毁、传递给函数、作为值返回,并拥有编程语言中其他变量所拥有的所有权利。
根据语言的不同,这可能意味着:
可表示为匿名文字值的
可存储在变量中
可以存储在数据结构中
具有内在同一性(独立于任何名字)
与其他实体平等的
作为过程/函数的参数可以通过的
作为程序/功能的结果是可返回的
在运行时是可构造的
可打印
可读的
可在分布式进程之间传输
可在运行进程之外存储
来源。
但是,在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中),他真的是说“一切都是一流的”吗?
术语object可以松散地使用,并不意味着是第一类。将整个概念称为“第一类实体”可能更有意义。但在python中,它们的目标是让一切都成为一流的。我相信发表你声明的人的意图是指头等舱。

ejk8hzay

ejk8hzay5#

在我看来,这是用自然语言描述事物的隐喻之一。该术语基本上用于将函数描述为第一类对象的上下文中。
如果你考虑一种面向对象的语言,我们可以赋予对象各种特性,例如:继承、类定义、传递给其他代码段(方法参数)的能力、在数据结构中存储的能力等等。如果我们可以对一个通常不被视为对象的实体做同样的事情,与java脚本中的函数一样,这些实体被认为是第一类对象。
第一类在这里基本上是指,不作为第二类处理(具有降级行为)。从本质上说,嘲弄是完美的或无法区分的。

相关问题