如果行为不同,Ruby if if vs end?

时间:2012-06-13 20:27:12

标签: ruby

为什么这段代码不起作用?

b if b = true

错误:undefined local variable or method `b'

但这样做:

if b = true
    b
end

它们应该不一样吗?

5 个答案:

答案 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”。