Ruby方法参数?
我是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_
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