为什么(a_method ||:other)返回:仅在分配给名为a_method的var时才返回?

Pau*_*ley 5 ruby

给出以下方法:

def some_method
  :value
end
Run Code Online (Sandbox Code Playgroud)

以下语句按预期工作:

some_method || :other
# => :value

x = some_method || :other
# => :value
Run Code Online (Sandbox Code Playgroud)

但是以下陈述的行为让我感到困惑:

some_method = some_method || :other
# => :other
Run Code Online (Sandbox Code Playgroud)

它创建一个名为some_methodexpected 的局部变量,以及后续调用以some_method返回该局部变量的值.但为什么要分配:other而不是:value

我知道这可能不是一件明智的事情,并且可以看出它是如何模棱两可的,但我认为应该在考虑任务之前对作业的右侧进行评估......

我已经在Ruby 1.8.7和Ruby 1.9.2中测试了这个,结果相同.

干杯!

保罗

Mla*_*vić 5

有类似的问题,但不完全相同.Jörg的答案似乎达到了重点,我引用了相关部分:

此时foo,即使该行永远不会执行,也会定义.线永远不会被执行的事实完全无关紧要,因为解释器无论如何都与此无关:局部变量由解析器定义,解析器显然看到这一行.

因此,在您的情况下,无论已存在具有相同名称的方法,解析器都会看到some_method赋值,并自动将标记"标记"为局部变量.因此,当解释器开始评估赋值的右侧时,它已经认为some_method是局部变量,而不是方法.它的值是未分配的(nil默认情况下),因此结果||将是:other.