为什么这段代码不起作用?
b if b = true
错误:undefined local variable or method `b'
但这确实:
if b = true
b
end
他们不应该是一样的吗?
为什么这段代码不起作用?
b if b = true
错误:undefined local variable or method `b'
但这确实:
if b = true
b
end
他们不应该是一样的吗?
这个问题问得好。它与 Ruby 中变量的作用域有关。
这是Matz 在 Ruby 错误跟踪器上发表的一篇关于此的帖子:
局部变量范围从上到下、从左到右确定。所以在if修饰符的条件下首先赋值的局部变量在左侧if体中是无效的。这是一个规范。
在第一个版本中,一旦k
被击中,解析器就会呕吐,因为它还没有被看到。
在第二个版本中,k
它是赋值表达式的一部分,并且被不同地解析。
我不知道原因,但解释器k
在评估条件之前尝试查找变量的问题。
如果你这样写,就不会出现任何错误,并且可以按预期工作:
k = nil
h = {k: 1}
v = k if k = h.delete(:k)
因为 Ruby 解释器在看到赋值时会创建一个局部变量
在第二种情况下,它还没有看到赋值,所以在解析表达式时变量不存在。
更准确地说,一个方法首先被解析成一个内部表示,然后,也许代码最终会被调用并实际执行。
局部变量是在该解析过程中创建的。这是一个声明的问题,它只是意味着解释器会意识到它们。在有人调用周围的方法之前,它们不会在被赋予空间或值的意义上被创建。
你只放了一个'='
尝试使用'=='
然后你会得到错误
在第二个示例中,您将“true”分配给 b。