您将不得不考虑 Ruby 解析器。
这将正常工作:
age >= 21 ? puts("You're over 21!") : puts("You're too young.")
原因是如果你使用puts
不带括号的方法,解析器不理解后面的:
token;它没有意识到它之前与三元运算符相关联。你也可以这样做:
puts age >= 21 ? "You're over 21!" : "You're too young."
这很好——解析器在这里没有遇到任何歧义。
你也可以这样做:
puts "You're #{ age >= 21 ? 'over 21!' : 'too young.' }"
这就是发生歧义的原因。假设你有两个函数,x
并且a
,像这样:
2.0.0-p195 :033 > def x(y)
2.0.0-p195 :034?> y + 1
2.0.0-p195 :035?> end
=> nil
2.0.0-p195 :036 > def a(b)
2.0.0-p195 :037?> b + 2
2.0.0-p195 :038?> end
=> nil
括号在这里没有区别:
2.0.0-p195 :039 > x a 1
=> 4
2.0.0-p195 :040 > x a(1)
=> 4
2.0.0-p195 :041 > x(a(1))
=> 4
2.0.0-p195 :042 > x(a 1)
=> 4
但如果x
可以采用多个参数呢?现在你必须帮助解析器:
2.0.0-p195 :043 > def x(y, z)
2.0.0-p195 :044?> y + z + 1
2.0.0-p195 :045?> end
让我们像以前一样拨打不带括号的电话:
2.0.0-p195 :047 > x a 1, 2
您是传递a(1), 2
给x
,还是试图调用a(1, 2)
并将结果传递给x
?按照惯例,Ruby 假定您正在尝试调用a(1, 2)
,但a
只接受一个参数,因此您会收到错误消息:
ArgumentError: wrong number of arguments (2 for 1)
from (irb):36:in `a'
所以你需要括号:
2.0.0-p195 :052 > x a(1), 2
=> 6