17

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

b if b = true

错误:undefined local variable or method `b'

但这确实:

if b = true
    b
end

他们不应该是一样的吗?

4

5 回答 5

17

这个问题问得好。它与 Ruby 中变量的作用域有关。

这是Matz 在 Ruby 错误跟踪器上发表的一篇关于此的帖子:

局部变量范围从上到下、从左到右确定。所以在if修饰符的条件下首先赋值的局部变量在左侧if体中是无效的。这是一个规范。

于 2012-06-13T20:39:44.977 回答
2

在第一个版本中,一旦k被击中,解析器就会呕吐,因为它还没有被看到。

在第二个版本中,k它是赋值表达式的一部分,并且被不同地解析。

于 2012-06-13T20:37:59.553 回答
2

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

如果你这样写,就不会出现任何错误,并且可以按预期工作:

k = nil
h = {k: 1}
v = k if k = h.delete(:k)
于 2012-06-13T20:38:53.143 回答
0

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

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

更准确地说,一个方法首先被解析成一个内部表示,然后,也许代码最终会被调用并实际执行。

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

于 2012-12-25T21:17:16.603 回答
0

你只放了一个'='

尝试使用'=='

然后你会得到错误

在第二个示例中,您将“true”分配给 b。

于 2018-07-17T09:29:40.877 回答