嗨我有关于铁轨上的红宝石的问题
显然我有这样的声明:
def sort_column
Product.column_names.include?(params[:sort]) ? params[:sort] : "name"
end
根据我的阅读,据说这种方法基于params [:sort]对列进行排序,如果没有params,产品将按“name”排序。但是,我不明白这个陈述的写法,特别是第二个“?”。有人可以向我解释一下吗?
这是您的代码,重新排列以便于理解。
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
第一个问号是方法名称的一部分,第二个问号是三元运算符的一部分(您应该阅读它)。
?:
is a ternary operator以多种语言呈现。它具有以下语法:
expression ? value_if_true : value_if_false
在Ruby中,它是一个较短的版本:
if expression
value_if_true
else
value_if_false
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
包含params[:sort]
,它将返回params[:sort]
。否则,它将返回"name"
。
我们必须要小心要在三元运算符中求值的表达式部分,例如当使用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"