一流的公民

naw*_*awK 7 first-class

维基文章中的一等公民定义说:

一个对象是第一类的

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

有人可以解释/详细说明第5项要求(粗体)吗?我觉得这篇文章应该提供更多细节,因为"内在身份"正在捕捉到什么意义.

也许我们可以在我们的讨论中使用Javascript中的函数和C中的函数来说明第5个子弹.

我相信C中的函数是第二类的,而函数在Javascript中是一流的,因为我们可以在Javascript中执行以下操作:

var foo = function () { console.log("Hello world"); };
Run Code Online (Sandbox Code Playgroud)

,在C中是不允许的.

同样,我的问题实际上是在第5个子弹(要求).

Mat*_*all 9

从概念上讲,内在身份非常简单.如果一件东西拥有它,它的身份不依赖于该东西外部的东西.它可以是别名,引用,重命名,有什么你,但它仍然保持"身份"的任何东西.人们(大多数人,无论如何)都有内在的身份.你是,不管你的名字是什么,或者你住的地方,或者有什么身体变化可能会在生活中遭受了.

另一方面,电子没有内在的同一性.也许在这里引入量子力学只是混淆了这个问题,但我认为这是一个非常奇妙的例子.没有办法"标记"或"标记"电子,以便我们可以区分它和邻居.如果用一个电子替换另一个电子,绝对没有办法区分旧电子和新电子.

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

{} === {} // false
Run Code Online (Sandbox Code Playgroud)

但这是真的:

function foo () {}
var bar = foo;
var baz = bar;
baz === foo; // true
Run Code Online (Sandbox Code Playgroud)