代码之家  ›  专栏  ›  技术社区  ›  Federico A. Ramponi

什么是“头等”物品?

  •  157
  • Federico A. Ramponi  · 技术社区  · 16 年前

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

    编辑。当一个人说“一切都是一个对象”(就像在Python中一样),他真的是说“一切都是一流的”吗?

    5 回复  |  直到 8 年前
        1
  •  142
  •   community wiki 9 revs, 2 users 98% Brian R. Bondy    7 年前

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

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

    根据语言,这可以 暗示:

    • 可以表示为匿名文字值
    • 可存储在变量中
    • 可存储在数据结构中
    • 具有内在的同一性(独立于任何给定的名称)
    • 与其他实体的平等性具有可比性
    • 可作为过程/函数的参数传递
    • 由于程序/功能而可返回
    • 在运行时可构造
    • 可印刷的
    • 可读
    • 可在分布式进程之间传输
    • 可存储在运行进程之外

    Source .

    在C++中,函数本身不是第一类对象,但是:

    • 您可以重写“()”运算符,从而使对象函数成为可能,这是第一类。
    • 函数指针是第一类。
    • Boost Bind、lambda和函数的确提供一流的函数

    在C++中,类不是第一类对象,但这些类的实例是。在python中,两个类 这些对象是第一类对象。(见 this answer 有关类作为对象的详细信息)。

    下面是一个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
    

    Source .

    不是第一类对象的实体称为第二类对象。C++中的函数是第二类,因为它们不能动态创建。

    关于编辑:

    编辑。当一个人说“一切都是 一个物体(就像在巨蟒中一样),是吗? 实际上是说“一切都是 “一流”?

    “对象”一词可以随意使用,并不意味着它是一流的。把整个概念称为“第一类实体”可能更有意义。但在python中,它们的目标是使一切都成为一流的。我相信做你陈述的人的意图是一流的。

        2
  •  18
  •   Konrad Rudolph    16 年前

    _头等舱_意味着您可以按常规方式操作它们。大多数时候,这仅仅意味着你可以把这些一级公民作为函数的参数传递,或者从函数中返回。

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

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

        3
  •  17
  •   Federico A. Ramponi    16 年前

    从幻灯片中 Structure and Interpretation of Computer Programs ,第2A讲(1986),依次引用 Christopher Stracey :

    一等公民的权利和特权:

    • 由变量命名。
    • 作为参数传递给过程。
    • 作为过程值返回。
    • 纳入数据结构
        4
  •  16
  •   S.Lott    16 年前

    当一个人说“一切都是一个对象”(就像在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、bOL、双、char),它们不是适当的对象。这就是为什么Java必须将整数、布尔、双和字符引入第一类的原因。对于初学者来说,这可能很难教——不清楚为什么原始类型和类必须并排存在。

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

    类型 type 'int' 对象,它具有方法、属性和类型。

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

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

    >>> type(type(2))
    <type 'type'>
    
        5
  •  2
  •   questzen    16 年前

    在我看来,这是用自然语言描述事物的隐喻之一。这个术语基本上是在将函数描述为第一类对象的上下文中使用的。

    如果考虑面向对象语言,我们可以将各种特性赋予对象,例如继承、类定义、传递到代码的其他部分(方法参数)的能力、存储在数据结构中的能力等。如果我们可以用一个通常不被视为对象的实体来做同样的事情,比如Java SCR中的函数。IPT,这些实体被认为是第一类对象。

    这里的第一类基本上是指,不作为第二类处理(具有降级行为)。从本质上讲,嘲弄是完美的或难以区分的。