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

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

b if b = true 

错误: undefined local variable or method `b'

但这样做:

 if b = true b end 

它们不应该是一样的吗?

这个问题问得好。 它与Ruby中的变量范围有关。

以下是Matz关于Ruby bug跟踪器的post :

局部变量范围确定为向下,从左到右。 因此,如果是主体,则在if修饰符的条件下首先分配的局部变量在左侧无效。 这是一个规范。

在第一个版本中,一旦k被击中,解析器就会因为尚未被看到而呕吐。

在第二个版本中, k是赋值表达式的一部分,并且以不同方式进行解析。

我不知道原因,但解释器在评估条件之前尝试查找变量k的问题。

如果你这样写,它将不会有任何错误,并按预期工作:

 k = nil h = {k: 1} v = k if k = h.delete(:k) 

因为Ruby解释器在看到赋值时会创建一个局部变量

在第二种情况下,它还没有看到赋值,因此在解析表达式时变量不存在。

更确切地说,首先将方法解析为内部表示,然后,最终可能会调用并实际执行代码。

在该解析过程中创建局部变量。 这是一个声明问题,它只是意味着解释器会意识到它们。 在被某人调用周围方法之前,它们不会被赋予空间或值的意义。

你只放了一个’=’

试试’==’

然后你会得到错误

在第二个示例中,您将为b分配’true’。