我可以使用只有一个结果的三元运算符吗?

时间:2016-04-09 20:01:34

标签: ruby

我会使用这样的语句遇到任何问题:

options[:discount] ? "Does something if true" : nil

而不是:

"Do something if true" if options[:discount]

我不确定我是否真的会使用以前的语法,但我感兴趣的是,在这样的语句中返回nil会导致任何问题。只是想了解更多关于Ruby的结构,这对我来说是一个有趣的问题。感谢您的任何见解!

2 个答案:

答案 0 :(得分:3)

这可能取决于您如何使用它。

让我们试试

options = {
  :discount => true
}

x = options[:discount] ? "Does something if true" : nil
y = "Do something if true" if options[:discount] 

p x
p y

你得到了

"Does something if true"
"Do something if true"

使用false - 值,您会得到两次nil

如果要立即打印结果,而不使用

中的其他变量
p options[:discount] ? "Does something if true" : nil
p "Do something if true" if options[:discount] 

true得到的结果相同,但false只得到一个nilif - 子句用于完整表达式{{1} }。

或另一个例子:

您可以使用三元运算符作为参数:

p "Do something if true"

但你得到def my_method(par) p par end my_method(options[:discount] ? "Does something if true" : nil)

syntax error, unexpected modifier_if, expecting ')'

您可以使用my_method("Do something if true" if options[:discount]) 两个大括号:

if

或您使用

my_method(("Do something if true" if options[:discount]))

答案 1 :(得分:1)

一个区别是这两个运营商的优先级。请考虑以下事项:

options = {discount: false}
prexisting_value = "prexisting value"

使用第一个表达式,你得到这个:

prexisting_value = options[:discount] ? "Does something if true" : nil
p prexisting_value
=> nil

使用第二个表达式,你得到这个:

prexisting_value = "Do something if true" if options[:discount]
p prexisting_value
=> "prexisting_value"

这是因为两个示例的解析方式不同(请注意括号的位置):

prexisting_value = (options[:discount] ? "Does something if true" : nil)

VS

(prexisting_value = "Do something if true") if options[:discount]