问号和冒号 - 如果在红宝石中

时间:2012-06-25 14:28:05

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

您好我有关于铁轨上的红宝石的问题

显然我有这样的陈述:

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

根据我的阅读,据说这种方法基于params [:sort]对列进行排序,如果没有params,产品将按“name”排序。但是,我不明白这个陈述的写法,特别是第二个“?”。有人可以向我解释一下吗?

5 个答案:

答案 0 :(得分:15)

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

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

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

答案 1 :(得分:10)

许多语言中都存在

?: is a ternary operator。它具有以下语法:

expression ? value_if_true : value_if_false

在Ruby中,它是一个较短的版本:

if expression
  value_if_true
else
  value_if_false
end

答案 2 :(得分:4)

该行大致翻译为:

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

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

答案 3 :(得分:2)

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"

答案 4 :(得分:0)

我们必须小心要在三元运算符中评估的表达式部分,例如,当使用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"