我是Ruby的新手,我完全厌恶.为什么以下代码:
def some_method(v=1) 10*v end
puts (some_method (1).next)
puts some_method (1).next
Run Code Online (Sandbox Code Playgroud)
评估:
20
11
Run Code Online (Sandbox Code Playgroud)
在Ruby 1.8.7中,第一个示例的计算结果为20,因为这是正确的行为.
让我们分解吧.我们一开始
puts (some_method (1).next)
Run Code Online (Sandbox Code Playgroud)
然后我们添加缺少/隐含的括号:
puts((some_method((1).next)))
Run Code Online (Sandbox Code Playgroud)
让我们把它分成几个部分:
puts(
(
some_method(
(1).next
)
)
)
Run Code Online (Sandbox Code Playgroud)
Ruby从内部开始,进行评估(1).这个的价值是1,所以我们得到了
puts(
(
some_method(
1.next
)
)
)
Run Code Online (Sandbox Code Playgroud)
接下来1.next,返回2:
puts(
(
some_method(
2
)
)
)
Run Code Online (Sandbox Code Playgroud)
因此,Ruby 2作为参数传递给some_method,然后乘以10并返回正确的值,20:
puts(
(
20
)
)
Run Code Online (Sandbox Code Playgroud)
这 - 毫不奇怪的输出20.
你可能想写的是
puts some_method(1).next
Run Code Online (Sandbox Code Playgroud)
哪个输出11.您在方法名称和括号之间添加的空间非常重要.
有趣的是,如果您确实在运行1.8.7,那么您实际上会在最后一个例子中收到警告:
>> puts some_method (1).next
(irb):13: warning: don't put space before argument parentheses
11
=> nil
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
177 次 |
| 最近记录: |