11

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

显然我有这样的声明:

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

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

4

5 回答 5

18

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

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

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

于 2012-06-25T14:31:51.433 回答
11

?:是一个存在于许多语言中的三元运算符。它具有以下语法:

expression ? value_if_true : value_if_false

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

if expression
  value_if_true
else
  value_if_false
end
于 2012-06-25T14:34:50.537 回答
4

该行大致翻译为:

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

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

于 2012-06-25T14:33:59.347 回答
2
Product.column_names.include?(params[:sort]) ? params[:sort] : "name"

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

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

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

于 2012-06-25T14:35:59.993 回答
0

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

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"
于 2019-03-15T06:40:41.520 回答