嗨,我有一个关于 ruby on rails 的问题
显然我有这样的声明:
def sort_column
Product.column_names.include?(params[:sort]) ? params[:sort] : "name"
end
根据我的阅读,据说此方法基于 params[:sort] 对列进行排序,如果没有参数,则产品将按“名称”排序。但是,我不明白这句话的写法,尤其是第二个“?”。有人可以向我解释吗?
嗨,我有一个关于 ruby on rails 的问题
显然我有这样的声明:
def sort_column
Product.column_names.include?(params[:sort]) ? params[:sort] : "name"
end
根据我的阅读,据说此方法基于 params[:sort] 对列进行排序,如果没有参数,则产品将按“名称”排序。但是,我不明白这句话的写法,尤其是第二个“?”。有人可以向我解释吗?
这是您的代码,重新排列以便于理解。
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
第一个问号是方法名称的一部分,第二个问号是三元运算符的一部分(您应该阅读它)。
该行大致翻译为:
if Product.column_names.include?(params[:sort])
params[:sort]
else
"name"
end
这 ?: 是三元运算符;简短 if-else 的简写。
Product.column_names.include?(params[:sort]) ? params[:sort] : "name"
第一个问号是方法名的一部分:include?
.
第二个问号和冒号是三元操作数的一部分:
(if this is true) ? (do this) : (else, do that).
这意味着,如果Product.column_names
contains params[:sort]
,它将返回params[:sort]
。否则,它将返回"name"
。
我们必须小心要在三元运算符中计算的表达式部分,例如在使用and
vs时&&
,可能会发生这种情况:
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"