Ruby on rails 问号和冒号-ruby中的if-else

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

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

显然我有这样一个说法:

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"