我的理解是,行尾的 if
语句在行首的代码之前求值:
'never shown' if (false)
并且可以在 if
语句中赋值。
'shown' if (value = 'dave is king')
value #=> "dave is king"
并且,当一个不存在的变量被赋值时,它被创建。没有必要预先存在。这是真的吗?
如果所有这些假设都是正确的,为什么会失败?
error_array << error if (error = import_value(value))
#=> undefined local variable or method `error' for
数组push前赋值错误对吧?我想了解何时评估事物。
这个确实有效:
if (error = import_value(value))
error_array << error
end
现在我真的很困惑。
最佳答案
只有当您尝试分配文字值时才会发生这种情况,如果您调用一个函数它就可以工作。
def foo(a)
a
end
p 'not shown' if(value = foo(false))
p 'shown' if(value = foo(true))
# This outputs a Warning in IRB
p 'shown' if(value = false)
(irb):2: warning: found = in conditional, should be ==
如果打开调试 (-d),您将看到有关已使用变量 value
的警告
warning: assigned but unused variable - value
这个“有效”是因为就 if 而言,该语句的计算结果确实为 true
,从而允许它之前的代码运行。
这里发生的事情是当 if() 用作修饰符时有它自己的绑定(bind)范围或上下文。所以赋值永远不会在 if 之外出现,因此执行起来毫无意义。这与 if 控制结构不同,因为 if 语句采用的 block 也在与赋值相同的范围内,而 if 修饰符之前的行不在 if 的范围内。
换句话说,它们不是等价的。
if a = some(value)
puts a
end
puts a if(a = some(value))
前者在 if 范围内有 puts a
,后者在范围外有 puts a
,因此具有不同的绑定(bind)(ruby 称之为上下文)。
关于ruby - 解析与操作的可变范围和顺序 : Assignment in an "if",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15102804/