为什么Rust允许变量遮蔽的原因是什么?

29
在Rust中,鼓励使用变量遮蔽:

但是等等,程序已经有一个名为guess的变量了吗?它确实有,但是Rust允许我们使用新值来遮蔽guess的先前值。

这个特性难道不会引入问题吗,比如:

  • 难以跟踪代码(更容易创建bug)
  • 访问变量时意图访问其他变量(创建bug)

我根据自己的经验和以下来源得出上述信息:1 2 3 4 5

包含变量遮蔽的决策背后的原因是什么?

它确实有优点,可以只创建guess而不是guess_str vs guess_int。但是它既有优点也有缺点。

什么使Rust的发明者相信其优势大于劣势? 编程世界似乎对此存在分歧;一些语言只发出警告并不鼓励变量遮蔽,有些语言则明确禁止,有些允许,甚至还有一些鼓励使用。这其中的道理是什么?
如果可能的话,我想更多地了解,并且完整的回答可能包括:
  • 有哪些优势/劣势?
  • 遮蔽变量的用例是什么?
  • Rust中何时不应使用它们?
  • 来自不同编程背景的人需要注意什么?(以及不要陷入哪些陷阱)

1
评论不适合进行长时间讨论;本次交谈已经移至聊天室 - deceze
2
这本书清晰地阐述了他们的决定理由,但你提出问题的方式让它看起来带有个人观点且不够精确。Shadowing允许我们重复使用变量名而不是创建唯一的变量名;它允许我们转换变量而不使它们成为mut;它让我们在不手动创建两个不同类型的变量的情况下转换类型(通过自动化使事情简洁);Shadowing是可选的(你不必这样做),并且不是非常复杂或难以阅读。如果Shadowing真的存在问题,你考虑过一次只问一个问题吗? - Wolfpack'08
7
感觉你没有仔细阅读问题,我知道为什么示例中使用了 shadowing。如果你读完标题之外的内容,你就会知道我在问为什么将 shadowing 整体 加入到 Rust 中的理由。 - Gizmo
这个问题有一个基于事实、非观点的答案,应该重新开放。 - Alex R
影子变量允许您更改由变量名称引用的内存位置,但更改内存位置中的值仍然是不可能的(除非您进行了变异)。不确定为什么这个问题被标记为基于观点的。更多信息请参见此SO答案:https://dev59.com/m1QJ5IYBdhLWcg3wuoX7#53235438 - Luigi
1个回答

37
因为它最初得到支持并且从未被删除
"更像是我们从未禁止过变量遮蔽,因为这只是编译器实现的结果。据我回忆,Graydon曾提出禁止变量遮蔽的想法,但我坚持保留该功能,其他人并不在意,所以它就一直存在。" - pcwalton 另请参阅:
- RFC 459:禁止类型/生命周期参数遮蔽 - Rust中'let x = x'是什么意思? - 当我可以有可变的变量绑定时,为什么需要重新绑定/遮蔽? - 在Rust中,“遮蔽”和“可变性”有什么区别?

这个人的表现果然不出所料。先生,我给你点赞了。 - Marco Bonelli
4
没什么特别的,我只是在 Google 上搜索了“rust rfc shadowing”并点击了第六个链接,然后复制粘贴了这段引用。 :-) - Shepmaster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接