一等公民

标签 first-class

一等公民的定义见wiki article说:

An object is first-class when it


  • 可以存储在变量和数据结构中
  • 可以作为参数传递给子程序
  • 可以作为子程序的结果返回
  • 可以在运行时构建
  • 具有内在身份(独立于任何给定名称)

  • 有人可以解释/详细说明第 5 个要求(粗体)吗?我觉得这篇文章应该提供更多的细节,比如“内在身份”在什么意义上被捕获。
    也许我们可以在讨论中使用 Javascript 中的函数和 C 中的函数来说明第 5 个项目符号。
    我相信 C 中的函数是二等的,而 Javascript 中的函数是一等的,因为我们可以在 Javascript 中执行以下操作:
    var foo = function () { console.log("Hello world"); };
    
    ,这在 C 中是不允许的。
    同样,我的问题确实在第 5 个项目符号(要求)上。

    最佳答案

    从概念上讲,内在身份非常简单。如果一个事物拥有它,它的身份不取决于该事物的外部事物。它可以被别名、引用、重命名、你有什么,但它仍然保持“身份”是什么。人们(无论如何,他们中的大多数)都有内在的身份认同。你就是你,无论你叫什么名字,或者你住在哪里,或者你在生活中可能遭受过什么样的 body 变化。

    另一方面,电子没有内在身份。也许在这里引入量子力学只会混淆这个问题,但我认为这是一个非常棒的例子。没有办法“标记”或“标记”一个电子,以便我们可以区分它和邻居之间的区别。如果将一个电子替换为另一个电子,则绝对无法区分新旧电子。

    回到计算机:“内在身份”的一个例子可能是 Object#hashCode() in Java 返回的值, 或者 JavaScript 引擎使用的任何允许此语句为假的机制:

    {} === {} // false
    

    但这是真的:
    function foo () {}
    var bar = foo;
    var baz = bar;
    baz === foo; // true
    

    关于一等公民,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17461003/

    相关文章:

    scala - Scala 案例模式是一等的吗?

    python - 如何让 Python 2 的 __getitem__ 在一个类上工作?

    macros - Erlang 中的一等模式?

    command-line - 动态实例化 OCaml 中的模块

    c# - Java 和 C# 中的一等对象是什么?

    java - 将类存储在 Map 中以便可以实例化它们

    python - Python 中作为函数指针的类字段

    erlang - Erlang 中的一等模式? (备择方案)