我是Ruby的新手,我完全厌恶。为什么以下代码:
def some_method(v=1) 10*v end
puts (some_method (1).next)
puts some_method (1).next
评估为:
20
11
答案 0 :(得分:5)
在Ruby 1.8.7中,第一个示例的计算结果为20,因为这是正确的行为。
让我们分解吧。我们从
开始puts (some_method (1).next)
然后我们添加缺失/隐含括号:
puts((some_method((1).next)))
让我们把它分成几个部分:
puts(
(
some_method(
(1).next
)
)
)
Ruby从内部开始,评估(1)
。它的价值是1
,所以我们得到了
puts(
(
some_method(
1.next
)
)
)
接下来,1.next
,返回2
:
puts(
(
some_method(
2
)
)
)
因此,Ruby将2
作为参数传递给some_method
,然后乘以10并返回正确的值20
:
puts(
(
20
)
)
这 - 毫不奇怪的输出20
。
你可能想写的是
puts some_method(1).next
输出11
。您在方法名称和括号之间添加的空间非常重要。
有趣的是,如果您确实在运行1.8.7,那么您实际上会在最后一个例子中收到警告:
>> puts some_method (1).next
(irb):13: warning: don't put space before argument parentheses
11
=> nil
答案 1 :(得分:1)
# first case
puts (some_method (1).next)
=>通过some_method(1)周围的().next将所有内容包装到puts中。
some_method (1).next => (1).next => 2 => 2*10 => 20
# second case
puts some_method (1).next
=>这里没有围绕投注的“包装”
some_method (1).next => 1*10 => 10 => 10.next => 11
更新:(红宝石1.9.2-p290)
“与空间”和“没有空间”之间的有趣区别(好吧,没有答案,这是我认为的另一个问题:))
irb(main):011:0> puts some_method (1).next
20
=> nil
irb(main):012:0> puts some_method(1).next
11
=> nil
答案 2 :(得分:1)
在ruby 1.8兼容模式下的jruby-1.6.7.2下,我看到:
20
11
在1.9兼容模式中,我看到了
20
20
我怀疑优先运营商有变化。