What is the difference between “if” statements with “then” at the end?

前端 未结 5 1202
一向
一向 2020-12-03 04:27

What\'s the difference between these two Ruby if statements when we put a then at the end of the if statement?

if(val          


        
相关标签:
5条回答
  • There's no difference at all.

    And, just FYI, your code can be optimized to

    something.meth( val == 'hi' ? 'hello' : 'right' )
    
    0 讨论(0)
  • 2020-12-03 04:44

    The then is only required if you want to write the if expression on one line:

    if val == "hi" then something.meth("hello")
    else something.meth("right")
    end
    

    That brackets in your example are not significant, you can skip them in either case.

    See the Pickaxe Book for details.

    0 讨论(0)
  • 2020-12-03 04:50

    The only time that I like to use then on a multi-line if/else (yes, I know it's not required) is when there are multiple conditions for the if, like so:

    if some_thing? ||
      (some_other_thing? && this_thing_too?) ||
      or_even_this_thing_right_here?
    then
      some_record.do_something_awesome!
    end
    

    I find it to be much more readable than either of these (completely valid) options:

    if some_thing? || (some_other_thing? && this_thing_too?) || or_even_this_thing_right_here?
      some_record.do_something_awesome!
    end
    
    # or
    
    if some_thing? ||
      (some_other_thing? && this_thing_too?) ||
      or_even_this_thing_right_here?
      some_record.do_something_awesome!
    end
    

    Because it provides a visual delineation between the condition(s) of the if and the block to execute if the condition(s) evaluates to true.

    0 讨论(0)
  • 2020-12-03 04:53

    then is a delimiter to help Ruby identify the condition and the true-part of the expression.

    if condition then true-part else false-part end

    then is optional unless you want to write an if expression in one line. For an if-else-end spanning multiple lines the newline acts as a delimiter to split the conditional from the true-part

    # can't use newline as delimiter, need keywords
    puts if (val == 1) then '1' else 'Not 1' end
    
    # can use newline as delimiter
    puts if (val == 1)
      '1'
    else
      'Not 1'
    end
    
    0 讨论(0)
  • 2020-12-03 04:59

    Here's a quick tip that is not directly related to your question: in Ruby, there is no such thing as an if statement. In fact, in Ruby, there are no statements at all. Everything is an expression. An if expression returns the value of the last expression that was evaluated in the branch that was taken.

    So, there is no need to write

    if condition
      foo(something)
    else
      foo(something_else)
    end
    

    This would better be written as

    foo(
      if condition
        something
      else
        something_else
      end
    )
    

    Or as a one-liner

    foo(if condition then something else something_else end)
    

    In your example:

    something.meth(if val == 'hi' then 'hello' else 'right' end)
    

    Note: Ruby also has a ternary operator (condition ? then_branch : else_branch) but that is completely unnecessary and should be avoided. The only reason why the ternary operator is needed in languages like C is because in C if is a statement and thus cannot return a value. You need the ternary operator, because it is an expression and is the only way to return a value from a conditional. But in Ruby, if is already an expression, so there is really no need for a ternary operator.

    0 讨论(0)
提交回复
热议问题