Ruby方法参数?

Ruby方法参数?,ruby,syntax,Ruby,Syntax,我是Ruby的新手,我非常讨厌。为什么会出现以下代码: def some_method(v=1) 10*v end puts (some_method (1).next) puts some_method (1).next 评估: 20 11 =>通过()围绕某个_方法(1)。接下来,所有内容都被包装到put中 some_method (1).next => (1).next => 2 => 2*10 => 20 # second case puts some_

我是Ruby的新手,我非常讨厌。为什么会出现以下代码:

def some_method(v=1) 10*v end

puts (some_method (1).next)
puts  some_method (1).next
评估:

20
11
=>通过()围绕某个_方法(1)。接下来,所有内容都被包装到put中

some_method (1).next => (1).next => 2 => 2*10 => 20

# second case
puts some_method (1).next
=>在puts周围没有“包装器”

some_method (1).next => 1*10 => 10 => 10.next => 11
更新:(ruby 1.9.2-p290)

“有空间”和“没有空间”之间有趣的区别(好吧,这不是答案,我想这是另一个问题:)


在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\u方法
,然后乘以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

在ruby 1.8兼容模式下的jruby-1.6.7.2下,我看到:

20
11
而在1.9兼容模式下,我看到

20
20

我怀疑优先级运算符发生了更改。

哪个Ruby版本?在1.9.3中,两行都返回20。在
2.0.0
中,两种情况下都返回20。@Jeffrey:那么Jeffrey,你认为查看代码的结果是明显的吗?你认为这样的语法/解析规则清晰吗?很好,在ruby>1.9中是固定的。无法复制。两个表达式都返回20。空间特征会影响评估顺序。如果你把它放在某个方法
1之后,那么接下来的
首先被计算,然后作为参数传递。如果省略空格,
(1)
作为参数传递,并对其结果调用
next
。一致且合乎逻辑。我不明白人们怎么会说Danilo写了糟糕的代码。它被记录在一定程度上起作用,但事实并非如此。显然,他的ruby版本中有一个bug。也许把它带到这里不是最好的地方,但如果是这样的话,就这么说吧。
20
11
20
20