Ruby方法参数?

时间:2013-09-17 10:52:04

标签: ruby syntax

我是Ruby的新手,我完全厌恶。为什么以下代码:

def some_method(v=1) 10*v end

puts (some_method (1).next)
puts  some_method (1).next

评估为:

20
11

3 个答案:

答案 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

我怀疑优先运营商有变化。