问号和冒号 - 如果在 ruby​​ 中其他

Posted

技术标签:

【中文标题】问号和冒号 - 如果在 ruby​​ 中其他【英文标题】:question mark and colon - if else in ruby 【发布时间】:2012-06-26 19:42:48 【问题描述】:

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

显然我有这样的声明:

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

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

【问题讨论】:

谢谢,我找到了这个:en.wikipedia.org/wiki/%3F: 我得说,我非常喜欢 Ruby 允许我以菊花链方式连接所有内容的方式,尽管看到末尾附加了方法的 do-end 块看起来确实很奇怪。 【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

该行大致翻译为:

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

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

【讨论】:

对于 C 和其他 if 是语句而不是表达式的语言,它不是一种速记方法。从技术上讲,没有理由在 Ruby 中使用它,如 Python 和 Lua 所示。【参考方案3】:

?: is a ternary operator 存在于多种语言中。它的语法如下:

expression ? value_if_true : value_if_false

在 Ruby 中,它是这个的更短版本:

if expression
  value_if_true
else
  value_if_false
end

【讨论】:

更重要的是,这是一个简短的版本:if expression then value_if_true else value_if_false end。 IOW:你可以在一行上写一个if-表达式,如果你愿意,你不需要使用可怕的神秘不可读的条件运算符。 @JörgWMittag,+1 内联if-else。使代码非常易读,与question? ? true : false 之类的东西相比,它真的很出色。我总是使用它,除非行变得长。【参考方案4】:
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"

【讨论】:

【参考方案5】:

我们必须小心在三元运算符中要计算的表达式部分,例如在使用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"

【讨论】:

以上是关于问号和冒号 - 如果在 ruby​​ 中其他的主要内容,如果未能解决你的问题,请参考以下文章

c语言中":"(冒号)和问号是啥意思

什么是问号“?”和冒号“:”运算符用于? [复制]

Cpp问号冒号

c语言中" : "(冒号)和问号是啥意思

TypeScript 中的问号+冒号双问号问号+点感叹号+点

TypeScript 中的问号+冒号双问号问号+点感叹号+点