为什么这段代码不起作用?
b if b = true
错误:undefined local variable or method `b'
但这样做:
if b = true
b
end
它们应该不一样吗?
答案 0 :(得分:15)
这是一个非常好的问题。它与Ruby中的变量范围有关。
以下是关于此的post by Matz on the Ruby bug tracker:
局部变量范围确定为向下,从左到右。因此,如果是主体,则在if修饰符的条件下首先分配的局部变量在左侧无效。这是一个规范。
答案 1 :(得分:2)
在第一个版本中,只要k
被击中,解析器会因为尚未看到它而呕吐。
在第二个版本中,k
是赋值表达式的一部分,并且解析方式不同。
答案 2 :(得分:2)
我不知道原因,但是在解析条件之前解释器试图查找变量k
的问题。
如果您这样写,则不会出现任何错误并按预期工作:
k = nil
h = {k: 1}
v = k if k = h.delete(:k)
答案 3 :(得分:0)
因为Ruby解释器在看到作业时会创建一个局部变量
在第二种情况下,它还没有看到赋值,因此在解析表达式时变量不存在。
更准确地说,首先将方法解析为内部表示,然后,最终可能会调用并实际执行代码。
在该解析过程中创建了 。这是一个宣言问题,它只是意味着口译员意识到了这一点。他们不会被赋予空间或价值,直到周围的方法被某人调用为止。
答案 4 :(得分:0)
您只输入了一个'='
尝试使用'=='
那么你会得到错误
在第二个示例中,您为b分配了“ true”。