问号和冒号 - 如果在 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 中其他的主要内容,如果未能解决你的问题,请参考以下文章