因为所有东西都是python中的一级对象,所以模糊的特殊情况相对较少。 例如,在java中,有一些基本类型(int、bool、double、char)不是正确的对象。这就是为什么java必须引入integer、boolean、double和character作为第一类类型。这对初学者来说可能很难教——不清楚为什么原始类型和类必须同时存在。 这也意味着一个对象的类本身就是一个对象。这与c不同,在c中,类在运行时并不总是有不同的存在。 类型 2 是 type 'int' 对象,它具有方法、属性和类型。
// 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
5条答案
按热度按时间xj3cbfub1#
“头等舱”是指你可以用通常的方式操作它们。大多数时候,这只是意味着可以将这些一级公民作为参数传递给函数,或者从函数返回它们。
这对于对象来说是不言而喻的,但对于函数,甚至是类来说并不总是如此明显:
这是c语言中的一个例子,函数实际上不是一级对象。因此,上面的代码使用了一个小的变通方法(即称为
Action<>
)把函数作为参数传递。其他语言,比如ruby,甚至允许将类和代码块作为普通变量(或者在ruby中是常量)。sr4lhrrt2#
当一个人说“一切都是一个对象”(就像在python中),他真的是说“一切都是一流的”吗
对。
python中的所有东西都是适当的对象。甚至在其他语言中是“原始类型”的东西。
你发现像这样的物体
2
实际上有一个相当丰富和复杂的界面。因为所有东西都是python中的一级对象,所以模糊的特殊情况相对较少。
例如,在java中,有一些基本类型(int、bool、double、char)不是正确的对象。这就是为什么java必须引入integer、boolean、double和character作为第一类类型。这对初学者来说可能很难教——不清楚为什么原始类型和类必须同时存在。
这也意味着一个对象的类本身就是一个对象。这与c不同,在c中,类在运行时并不总是有不同的存在。
类型
2
是type 'int'
对象,它具有方法、属性和类型。内置类型的类型,如
int
是type 'type'
对象。这也有方法和属性。3mpgtkmj3#
摘自《计算机程序的结构和解释》第2a讲(1986年),其中依次引用了克里斯托弗·斯特雷西的话:
一等公民的权利和特权:
以变量命名。
作为参数传递给过程。
作为程序的值返回。
纳入数据结构
368yc8dk4#
简而言之,它意味着对对象的使用没有限制。它和其他物体一样。
第一类对象是一个实体,它可以动态地创建、销毁、传递给函数、作为值返回,并拥有编程语言中其他变量所拥有的所有权利。
根据语言的不同,这可能意味着:
可表示为匿名文字值的
可存储在变量中
可以存储在数据结构中
具有内在同一性(独立于任何名字)
与其他实体平等的
作为过程/函数的参数可以通过的
作为程序/功能的结果是可返回的
在运行时是可构造的
可打印
可读的
可在分布式进程之间传输
可在运行进程之外存储
来源。
但是,在c中,函数本身不是第一类对象:
您可以重写“()”运算符,从而使对象函数成为可能,这是第一类。
函数指针是第一类的。
boost-bind、lambda和function都提供了一流的函数
在c中,类不是第一类对象,而是这些类的示例。在python中,类和对象都是第一类对象(有关类作为对象的更多详细信息,请参见此答案)。
下面是javascript第一类函数的示例:
来源。
不是第一类对象的实体称为第二类对象。c++中的函数是第二类的,因为它们不能动态创建。
关于编辑:
编辑。当一个人说“一切都是一个对象”(就像在python中),他真的是说“一切都是一流的”吗?
术语object可以松散地使用,并不意味着是第一类。将整个概念称为“第一类实体”可能更有意义。但在python中,它们的目标是让一切都成为一流的。我相信发表你声明的人的意图是指头等舱。
ejk8hzay5#
在我看来,这是用自然语言描述事物的隐喻之一。该术语基本上用于将函数描述为第一类对象的上下文中。
如果你考虑一种面向对象的语言,我们可以赋予对象各种特性,例如:继承、类定义、传递给其他代码段(方法参数)的能力、在数据结构中存储的能力等等。如果我们可以对一个通常不被视为对象的实体做同样的事情,与java脚本中的函数一样,这些实体被认为是第一类对象。
第一类在这里基本上是指,不作为第二类处理(具有降级行为)。从本质上说,嘲弄是完美的或无法区分的。