Ruby方法参数?

Woj*_*ilo 2 ruby syntax

我是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)

Jak*_*b S 5

在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)