Elixir:允许重新绑定变量的基本原理

tld*_*ldr 13 erlang elixir

当Erlang不允许时,允许在Elixir中重新绑定变量的原因是什么?

rvi*_*ing 10

大多数函数式语言不允许在同一范围内重新绑定变量.所以Elixir允许这样做确实给它一个非功能性的,迫切的感觉.Erlang的问题是缺乏范围,或者更确切地说,整个函数子句中只有一个范围.我们确实在讨论是否引入范围,但最终我们决定反对它,因为它与现有系统不相容.开发人员讨厌倒退不一致的变化.

Erlang的方式有一个好处严重:当你得到它错了,你通常得到一个错误,这样你就可以查阅的错误.这相比刚开奇怪的行为,当一个变量没有你指望它有它的值是MUCH难以检测和纠正.

我个人认为新的变量名称的问题,例如使用数字方案,被大大夸大了.相对于所花费的时间我摸出什么,我会做改变的变量名是微不足道的.过了一会儿,你只是看到它而没有反思它.老实说.

编辑:

此外,当通过一系列函数链接数据时,数据的实际含义会发生变化,因此重用相同的变量名称可能会产生误导.它最终只是意味着通用的"我从一个函数传递到另一个函数的数据".

  • 同意.我认为带有编号变量的例子要么是人为的,要么只是表现不佳.重复地将一个函数的结果作为参数传递给下一个函数,请求进行折叠,而不是变量重新绑定. (2认同)

Ono*_*cci 5

因为它更简单.

看一下2009年发布到Erlang邮件列表的这个问题.具体这一部分:


我喜欢大多数情况下的模式匹配,但我发现我编写了足够的代码,我需要逐步更新数据结构,并且当我有以下代码时,维护代码是一件痛苦的事情:

X = foo(),
X1 = bar(X),
X2 = xyzzy(X1),
blah(X2).
Run Code Online (Sandbox Code Playgroud)

后来想把它改成:

X = foo(),
X1 = whee(X),
X2 = bar(X1),
X3 = xyzzy(X2),
blah(X3).
Run Code Online (Sandbox Code Playgroud)

编者注 - 这是对该问题的回复.

这经历了很多IRC.这是变量命名实践不佳的结果,并且不需要引入重新绑定来"修复"它; 只需停止使用单个字母和计数器作为变量名称.

如果是例如写的

 FooStateX    = foo(),
 PostBarX     = bar(FooStateX),
 OnceXyzziedX = xyzzy(PostBarX),
 blah(OnceXyzziedX).
Run Code Online (Sandbox Code Playgroud)

代码证明在Erlang中并不罕见(请注意"这通过IRC很多").Elixir简单地重新绑定名称的能力使我们不必一直为事物生成新的虚拟名称.就这样.记住Erlang的原始创建者并没有尝试构建函数式语言是明智的.他们只是务实的开发人员,他们有一个问题需要解决.Elixir的方法是简单的实用主义.