这个结果背后的逻辑是什么?
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
),你会收到一个错误,因为现在这个方法签名没有意义。