大多数人都知道_
IRB作为最后一次返回值的持有者在IRB中的特殊含义,但这不是我要问的。
相反,我问的是什么_
时候在纯旧的Ruby代码中用作变量名。在这里,它似乎具有特殊的行为,类似于“不在乎变量”(la Prolog)。以下是一些有用的示例,说明了其独特的行为:
lambda { |x, x| 42 } # SyntaxError: duplicated argument name
lambda { |_, _| 42 }.call(4, 2) # => 42
lambda { |_, _| 42 }.call(_, _) # NameError: undefined local variable or method `_'
lambda { |_| _ + 1 }.call(42) # => 43
lambda { |_, _| _ }.call(4, 2) # 1.8.7: => 2
# 1.9.3: => 4
_ = 42
_ * 100 # => 4200
_, _ = 4, 2; _ # => 2
这些都是直接在Ruby中运行的(puts
添加了s)而不是在IRB中运行,以避免与它的其他功能冲突。
不过,这全都是我自己实验的结果,因为我在任何地方都找不到关于此行为的任何文档(诚然,这不是最简单的搜索内容)。最终,我很好奇所有这些在内部如何运作,因此我可以更好地准确了解其特殊之处_
。因此,我要求参考文档,最好是提供Ruby源代码(也许还有RubySpec)的参考资料,以揭示_
Ruby的行为。
注意:大部分是由与@Niklas B的讨论引起的。
lambda { |_, _| _ }.call(4, 2)
1.8和1.9之间的行为差异仅仅是无意的副作用吗?就像在“正常”情况下,变量名不能重复一样,它们的分配顺序无关紧要。