【问题标题】:Elixir, no circular reference possible?Elixir,不可能有循环引用?
【发布时间】:2016-12-13 06:17:48
【问题描述】:

我正在学习 Elixir,直到第 7 章 PragProg 书,在考虑了不变性和其他项目之后,我认为通常不可能在 Elixir 映射/元组/列表等中创建循环引用。其中 A -> B -> C -> A。

没有真正尝试欺骗系统,这是真的吗?

【问题讨论】:

  • 我在 Robert Virding in the mailing list 的帖子中发现了这一点,“Erlang 适合引用计数,因为它没有循环结构,它有一些循环引用,但它们只在知名的地方所以没有真正的问题。”我想您可以向他询问详细信息(或在此处获得答案)。 :)
  • 您可能想稍微修改一下您的问题;我不确定在循环引用的上下文中是否可以将 Maps、Tuples 和 Lists 视为“相等”。它们在其他意义上肯定不是等价的。您可能想缩小您的问题范围。

标签: elixir circular-reference


【解决方案1】:

由于不可变性,创建循环存在先有鸡还是先有蛋的问题。事实上,Elixir 并没有采取任何措施来阻止它。它只是在不变性中开箱即用。

证明:由于C在你的链上链接A就创建了,A必须提前存在; A 反过来链接B 因此B 必须在之前存在; B 链接C,要求C 存在,但尚未创建。 QED。

不能简单地引用一个不存在的Term*,也不能修改已有的,所以在Elixir中是不可能的。


* 请阅读 cmets 中关于此处措辞的讨论以及为什么最终选择了 Term

【讨论】:

  • 论证充分。
  • 我认为您可以使用流程链接创建循环引用。
  • @FredtheMagicWonderDog 你的意思是一个代理,持有对另一个代理的引用?可以,但这不会是引用对象的对象。
  • 是的,但是使用“对象”这个词会变得非常模糊。我认为在讨论 elixir/erlang 时使用术语来引用数据要清楚得多。条款是不可变的,因此您不能对条款进行循环引用。
  • @FredtheMagicWonderDog 同意。我相应地修改了我的答案。
猜你喜欢
  • 1970-01-01
  • 2010-12-09
  • 2016-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-21
  • 2021-12-09
  • 2011-03-30
相关资源
最近更新 更多