Variable scope and order of parsing vs. operations: Assignment in an “if”

后端 未结 3 977
既然无缘
既然无缘 2020-12-06 14:15

My understanding is that the if statements at the end of the line are evaluated before the code at the front of the line:

\'never shown\' if (fa         


        
3条回答
  •  青春惊慌失措
    2020-12-06 14:48

    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

提交回复
热议问题