条件表达式 (Conditional Expressions)

优质
小牛编辑
129浏览
2023-12-01

关键字 (Conditional keywords)

  • 永远不要把 then 和多行的 if/unless 搭配使用。

    # 错误
    if some_condition then
      ...
    end
    
    # 正确
    if some_condition
      ...
    end
  • do 不要和多行的 whileuntil搭配使用。

    # 错误
    while x > 5 do
      ...
    end
    
    until x > 5 do
      ...
    end
    
    # 正确
    while x > 5
      ...
    end
    
    until x > 5
      ...
    end
  • and, or, 和not 关键词禁用。 因为不值得。 总是用 &&||, 和 ! 来代替。

  • 适合用 if/unless 的情况: 内容简单, 条件简单, 整个东西能塞进一行。
    不然的话, 不要用 if/unless

    # 错误 - 一行塞不下
    add_trebuchet_experiments_on_page(request_opts[:trebuchet_experiments_on_page]) if request_opts[:trebuchet_experiments_on_page] && !request_opts[:trebuchet_experiments_on_page].empty?
    
    # 还行
    if request_opts[:trebuchet_experiments_on_page] &&
         !request_opts[:trebuchet_experiments_on_page].empty?
    
      add_trebuchet_experiments_on_page(request_opts[:trebuchet_experiments_on_page])
    end
    
    # 错误 - 这个很复杂,需要写成多行,而且需要注释
    parts[i] = part.to_i(INTEGER_BASE) if !part.nil? && [0, 2, 3].include?(i)
    
    # 还行
    return if reconciled?
  • 不要把 unlesselse 搭配使用。

    # 错误
    unless success?
      puts 'failure'
    else
      puts 'success'
    end
    
    # 正确
    if success?
      puts 'success'
    else
      puts 'failure'
    end
  • 避免用多个条件的 unless

      # 错误
      unless foo? && bar?
        ...
      end
    
      # 还行
      if !(foo? && bar?)
        ...
      end
  • 条件语句 if/unless/while 不需要圆括号。

    # 错误
    if (x > 10)
      ...
    end
    
    # 正确
    if x > 10
      ...
    end

三元操作符 (Ternary operator)

  • 避免使用三元操作符 (?:),如果不用三元操作符会变得很啰嗦才用。 对于单行的条件, 用三元操作符(?:) 而不是 if/then/else/end.

    # 错误
    result = if some_condition then something else something_else end
    
    # 正确
    result = some_condition ? something : something_else
  • 不要嵌套使用三元操作符,换成 if/else.

    # 错误
    some_condition ? (nested_condition ? nested_something : nested_something_else) : something_else
    
    # 正确
    if some_condition
      nested_condition ? nested_something : nested_something_else
    else
      something_else
    end
  • 避免多条件三元操作符。最好判断一个条件。

  • 避免拆成多行的 ?: (三元操作符), 用 if/then/else/end 就好了。

    # 错误
    some_really_long_condition_that_might_make_you_want_to_split_lines ?
      something : something_else
    
    # 正确
    if some_really_long_condition_that_might_make_you_want_to_split_lines
      something
    else
      something_else
    end