当Erlang不允许重新绑定Elixir中的变量时,理由是什么?
答案 0 :(得分:10)
大多数函数式语言不允许在同一范围内重新绑定变量。所以Elixir允许这样做确实给它一个非功能性的,迫切的感觉。 Erlang的问题是缺乏范围,或者更确切地说,整个函数子句中只有一个范围。我们确实在讨论是否引入范围,但最终我们决定反对它,因为它与现有系统不相容。开发人员讨厌不一致的变化。
Erlang方式有一个重要的好处:当你弄错了,你通常会收到一个错误,所以你可以 SEE 这个错误。这比较了当一个变量没有你希望它具有的值 MUCH 更难以检测和纠正时的奇怪行为。
我个人认为新的变量名称的问题,例如使用数字方案,被大大夸大了。与我完成 WHAT 的时间相比,我将更改变量名称是微不足道的。过了一会儿,你只是看到它而没有反思它。诚实。
修改
此外,当通过一系列函数链接数据时,数据的实际含义会发生变化,因此重复使用相同的变量名称可能会产生误导。它最终只是意味着通用的“我从一个函数传递到另一个函数的数据”。
答案 1 :(得分:9)
答案 2 :(得分:5)
因为它更简单。
查看2009年发布到Erlang邮件列表的this question。特别是这一部分:
我喜欢大多数情况下的模式匹配,但我发现我写了 足够的代码,我需要逐步更新数据结构,和 当我有以下代码时,保持代码是一种痛苦:
X = foo(),
X1 = bar(X),
X2 = xyzzy(X1),
blah(X2).
后来想把它改成:
X = foo(),
X1 = whee(X),
X2 = bar(X1),
X3 = xyzzy(X2),
blah(X3).
编者注 - 这是对该问题的回复。
这经历了很多IRC。这是变量命名差的结果 练习,没有必要引入重新绑定来“修复”它; 只需停止使用单个字母和计数器作为变量名称。
例如,如果写的是
FooStateX = foo(),
PostBarX = bar(FooStateX),
OnceXyzziedX = xyzzy(PostBarX),
blah(OnceXyzziedX).
代码证明在Erlang中并不罕见(请注意“这通过IRC很多”)。 Elixir简单地重新绑定名称的能力使我们不必一直为事物生成新的虚拟名称。就这样。记住Erlang的原始创建者并没有尝试构建函数式语言是明智的。他们只是务实的开发人员,他们有一个问题需要解决。 Elixir的方法是简单的实用主义。