Ruby on rails 问号和冒号-ruby中的if-else
嗨,我有一个关于ruby on rails的问题 显然我有这样一个说法:Ruby on rails 问号和冒号-ruby中的if-else,ruby-on-rails,ruby,ternary-operator,Ruby On Rails,Ruby,Ternary Operator,嗨,我有一个关于ruby on rails的问题 显然我有这样一个说法: def sort_column Product.column_names.include?(params[:sort]) ? params[:sort] : "name" end 据我所知,这种方法是根据params[:sort]对列进行排序的,如果没有params,则产品将按“name”排序。然而,我不明白这句话是怎么写的,尤其是第二句“?”。有人能给我解释一下吗 这是您的代码,重新排列以便于理解 def so
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
第一个问号是方法名称的一部分,第二个问号是三元运算符的一部分(您应该了解它)。这一行大致翻译为:
if Product.column_names.include?(params[:sort])
params[:sort]
else
"name"
end
那个是一个三元算子;简短的if-else的缩写。在许多语言中都有。它具有以下语法:
expression ? value_if_true : value_if_false
在Ruby中,它是以下内容的较短版本:
if expression
value_if_true
else
value_if_false
end
第一个问号是方法名称的一部分:include?
第二个问号和冒号是三元操作数的一部分:
(如果这是真的)?(这样做):(否则,就这样做)。
这意味着,如果
Product.column\u names
包含params[:sort]
,它将返回params[:sort]
。否则,它将返回“name”
我们必须小心三元运算符中要计算的表达式部分,例如,当使用和与和&
时,可能会发生以下情况:
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"
谢谢你,我发现了这个::我得说,我很喜欢Ruby允许我将所有东西菊花链起来,尽管看到一个do end块,其中end附加了一个方法,这看起来很奇怪。对于C语言和其他语言来说,这与其说是一种简写方法,不如说是一种变通方法,因为if
是一个语句而不是一个表达式。从技术上讲,没有理由在Ruby中使用它,如Python和Lua所示。更重要的是,它是一个简短的版本:if expression then value\u if\u true else value\u if\u false end
。IOW:您可以在一行上编写一个if
-表达式,如果您愿意,您不需要使用非常神秘的不可读条件运算符。@JörgWMittag,+1表示内联if
-else
。使代码非常可读,与question?真:假
。我总是用它,除非线太长。
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"