如果"if"语句位于子句的末尾,为什么ruby中的条件语句和赋值会失败?

Nee*_*ngh 5 ruby

为什么最后一个语句(语句末尾的"if(tmp2 = foo)")失败?

def foo;5;end

# this one works
if (tmp = foo)
  puts tmp.to_s
end

# why this one fails
puts tmp2.to_s if (tmp2 = foo) #=> undefined local variable or method ‘tmp2’ for main:Object
Run Code Online (Sandbox Code Playgroud)

sep*_*p2k 8

由于解析器的工作方式,它失败了.

从解析器的角度来看,变量tmp2从它首次被分配的代码中的点开始存在,直到它超出范围.为此,无论何时(或如果)实际执行赋值,只是在解析器看到赋值时(即它取决于代码中的赋值位置).

编辑:要扩展该位:

解析器决定名称是局部变量还是方法调用.解析器仅根据是否已经看到对该变量的赋值来做出该决定.因此,当解析器在看到之前看到tmp2时tmp2 = ...,它决定在这里tmp2引用一个方法.当代码的那部分实际执行时,它会尝试调用不存在的方法tmp2,这样你就会得到错误.