为什么Ruby让我在没有指定字符串的情况下调用String方法?

时间:2011-11-02 20:01:42

标签: ruby syntax

在阅读Programming Ruby时,我遇到了这段代码:

while gets
  num1, num2 = split /,/
end

虽然我直观地了解它的作用,但我不理解语法。 'split'是String类的一个方法 - 用Ruby的说法,哪个字符串是上面场景中'split'消息的接收者?

我可以在文档中看到“获取”将其结果分配给变量$ _,所以我的猜测是它隐含地使用$ _作为接收者 - 但是一大堆Google搜索未能确认猜测。如果是这种情况,我很想知道没有显式接收器的方法的一般规则。

我确实尝试了irb中的代码,并添加了一些诊断put调用,并且我验证了实际行为是您所期望的 - num1和num2获得由逗号分隔的输入的指定值。

2 个答案:

答案 0 :(得分:6)

Ruby 1.8的方法Kernel#split([pattern [, limit]])$_.split(pattern, limit)相同,gets设置$_的值。

答案 1 :(得分:4)

你基本上用你的解释钉了它(至少1.8.7,1.9.3给了我NoMethodError main},但恕我直言,这是可怕的Ruby(或者可能有人从Perl切换)。如果你把它重写成这样的东西,它会变得更加清晰:

while input = gets.chomp
  num1, num2 = input.split(/,/)
end

没有接收器的方法调用的一般规则是它们被发送到self,无论当前上下文中是什么。在顶层,它是前面提到的main$_循环Perlism似乎在1.9中消失了。