这个结果背后的逻辑是什么?

def foo(_, _='override') _ end p foo("bye bye") p foo("hello", "world") 

输出:

 "override" "hello" 

我能理解结果是:

 "override" "world" 

甚至:

 "bye bye" "hello" 

但是我得到的结果让我感到困惑。

如果为其传递参数,则默认参数的计算时间早于常规参数,否则最后计算它们。 几乎肯定但不确定如何certificate它。

这个例子中的含义:

在时间0呼叫p foo("hello", "world")

在时间1 _ = 'override'

在时间2 _ = "world"

在时间3 _ = "hello"

在时间打印4个变量,你看到“你好”

编辑这里有一些证据:

 def foo(_, _='override',_) _ end p foo("bye bye","goodbye") p foo("hello", "world", "three") 

版画

 "override" "three" 

我找不到比这更好的解释

ruby魔力下划线

其原因可以在Ruby的解析器中找到,在shadowing_lvar_gen中 。 如果变量名只包含一个下划线,则跳过所有正常的复制检查。

一种可能的解释是name _代表“未使用的变量”。 你甚至不应该引用它,更不用说期望它的任何价值。 由于它是一个特殊的名称,它从解析器中获得特殊处理(例如抑制“重复参数”错误)。 我想没有人愿意让这段代码产生逻辑结果,因为这些都是未使用的变量。

如果你将它重命名为其他任何东西(例如, a ),你会收到一个错误,因为现在这个方法签名没有意义。