【问题标题】:question mark and colon - if else in ruby问号和冒号 - 如果在 ruby​​ 中其他
【发布时间】:2012-06-26 19:42:48
【问题描述】:

您好,我有一个关于 ruby​​ on rails 的问题

显然我有这样的声明:

def sort_column
    Product.column_names.include?(params[:sort]) ? params[:sort] : "name"
end

根据我的阅读,据说此方法根据 params[:sort] 对列进行排序,如果没有参数,则产品将按“名称”排序。但是,我不明白这句话的写法,尤其是第二个“?”。有人可以向我解释吗?

【问题讨论】:

  • 谢谢,我找到了这个:en.wikipedia.org/wiki/%3F:
  • 我得说,我非常喜欢 Ruby 允许我以菊花链方式连接所有内容的方式,尽管看到末尾附加了方法的 do-end 块看起来确实很奇怪。

标签: ruby-on-rails ruby ternary-operator


【解决方案1】:

这是您的代码,重新排列以便于理解。

def sort_column
  cond = Product.column_names.include?(params[:sort]) 
  cond ? params[:sort] : "name"
  #  it's equivalent to this
  # if cond
  #   params[:sort]
  # else
  #   'name'
  # end
end

第一个问号是方法名称的一部分,第二个问号是三元运算符的一部分(您应该阅读一下)。

【讨论】:

    【解决方案2】:

    该行大致翻译为:

    if Product.column_names.include?(params[:sort])
        params[:sort]
    else
        "name"
    end
    

    那个? : 是三元运算符;简短 if-else 的简写。

    【讨论】:

    • 对于 C 和其他 if 是语句而不是表达式的语言,它不是一种速记方法。从技术上讲,没有理由在 Ruby 中使用它,如 Python 和 Lua 所示。
    【解决方案3】:

    ?: is a ternary operator 存在于多种语言中。它的语法如下:

    expression ? value_if_true : value_if_false
    

    在 Ruby 中,它是这个的更短版本:

    if expression
      value_if_true
    else
      value_if_false
    end
    

    【讨论】:

    • 更重要的是,这是一个简短的版本:if expression then value_if_true else value_if_false end。 IOW:你可以在一行上写一个if-表达式,如果你愿意,你不需要使用可怕的神秘不可读的条件运算符。
    • @JörgWMittag,+1 内联if-else。使代码非常易读,与question? ? true : false 之类的东西相比,它真的很出色。我总是使用它,除非行变得长。
    【解决方案4】:
    Product.column_names.include?(params[:sort]) ? params[:sort] : "name"
    

    第一个问号是方法名的一部分:include?

    第二个问号和冒号是三元操作数的一部分: (if this is true) ? (do this) : (else, do that).

    这意味着,如果Product.column_names 包含params[:sort],它将返回params[:sort]。否则,它将返回"name"

    【讨论】:

      【解决方案5】:

      我们必须小心在三元运算符中要计算的表达式部分,例如在使用and&& 时,可能会发生这种情况:

      2.6.2 :014 > a = false
       => false
      2.6.2 :015 > b = true
       => true
      2.6.2 :016 > a and b ? 'first' : 'second'
       => false
      2.6.2 :017 > a && b ? 'first' : 'second'
       => "second"
      2.6.2 :018 > (a and b) ? 'first' : 'second'
       => "second"
      

      【讨论】:

        猜你喜欢
        • 2017-10-26
        • 2010-12-18
        • 2020-04-30
        • 2012-12-20
        • 2019-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多