三元运算符
了解三元运算符及其在 Ruby 中的使用方法。
三元运算符的使用
三元运算符是任何编程语言中都非常有用的特性。它在 Ruby 中的实现方式与 C、Java、Python、JavaScript 等语言相同。一些程序员长期使用这个运算符,但可能并不熟悉它的名称。不过我们建议记住它的名字,因为使用正确的术语总是更清晰、更专业。
尽管名字听起来有些复杂,但其语法非常简单:
1something_is_truthy ? do_this() : else_this()
例如:
1is_it_raining? ? stay_home() : go_party()
这与下面这段使用 if...else 的代码完全等价:
1# 使用 if 条件调用 is_it_raining 2 3if is_it_raining? 4 stay_home() 5else 6 go_party() 7end
注意,在 Ruby 中我们可以省略空的括号以提高代码可读性。括号表示调用一个不带参数的方法。但 Ruby 足够智能,能够理解我们的意图:
1# 使用 if 条件调用 is_it_raining 并省略括号 2 3if is_it_raining? 4 stay_home 5else 6 go_party 7end
或者直接写成:
1# 使用三元运算符调用 is_it_raining 2 3is_it_raining? ? stay_home : go_party
注意上面这行代码中的双问号。这是有意为之的。我们应该默认某个方法名以问号结尾已被定义:
1def is_it_raining? 2 # ... 做些事情,比如调用外部天气服务 ... 3end
is_it_raining? 方法始终返回 true 或 false,即布尔类型。Ruby 的命名规范规定:如果一个方法返回布尔值,就应该在其名称末尾加上问号,使其看起来像一句用英语表达的问题,例如:“现在在下雨吗?”
然而,当结果依赖于某个变量时,一行式的三元运算符可能如下所示。注意这里只使用单个问号,这是三元运算符的必要条件:
1x ? stay_home() : go_party()
或者简写为:
1x ? stay_home : go_party
从上述示例可以看出,三元运算符语法更紧凑,能节省几行代码。因此,程序整体显得更简洁,也更易于他人阅读。三元运算符唯一的缺点是,只有在执行单一操作时才显得整洁。如果需要完成较复杂的逻辑,还是建议使用 if...else 结构。
三元运算的结果也可以保存到变量中。下面的例子中,我们将三元表达式的结果保存到 result 变量中:
1# 使用三元运算符将 is_it_raining 的返回值保存到变量中 2 3x = is_it_raining? 4result = x ? stay_home : go_party 5puts result
result 变量将保存 stay_home 或 go_party 方法的返回值。在上面的例子中,result 变量可能代表一个人喝了多少杯饮料:“如果我待在家里,我会看 Netflix,喝 0 到 1 杯啤酒;但如果我去派对,我会喝 1 到 2 杯啤酒。” 因此,result 变量在本例中仅保存数字,而 x 变量则存储 true 或 false,表示是否正在下雨。
上面这两行代码也可以用 if...else 重写:
1# 使用 if else 将 is_it_raining 的输出保存到 result 变量中 2 3x = is_it_raining? 4result = if x 5 stay_home 6else 7 go_party 8end