It only happens when you try to assign a literal value, if you call a function it works.
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 ==
If you turn on debugging (-d) you will see a warning about an used variable value
warning: assigned but unused variable - value
This "works" because the statement does evaluate to true
as far as if is concerned, allowing the code preceeding it to run.
What is happening here is that if() when used as a modifier has it's own binding scope, or context. So the assignment is never seen outside of the if, and therefore makes no sense to perform. This is different than if the control structure because the block that the if statement takes is also within the same scope as the assignment, whereas the line that preceeded the if modifier is not within the scope of the if.
In other words, these are not equivelant.
if a = some(value)
puts a
end
puts a if(a = some(value))
The former having puts a
within the scope of the if, the latter having puts a
outside the scope, and therefore having different bindings(what ruby calls context).
Ruby Order of Operations
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…