为什么在猴子修补String类时,Ruby中的`next`方法会引发SyntaxError,而`next!`或`self.next`却不引发?

时间:2019-01-22 12:43:25

标签: ruby

以下代码可以正常工作:

class String
  def foo
    next!
  end
end

puts 'hh'.foo    # hi

这也可以:

class String
  def foo
    self.next
  end
end

puts 'hh'.foo    # hi

但这不是:

class String
  def bar
    next
  end
end

# Invalid next (SyntaxError)

即使我正在研究next类,为什么Ruby为什么在这里使用String关键字并引发SyntaxError?

1 个答案:

答案 0 :(得分:7)

在前两个示例中,Ruby解析器确定您正在调用方法,因为无法使用next关键字。

在您的第三个示例中,您似乎正在使用the next keyword而不是调用方法。在这个阶段,解析器无法知道您实际上是要调用next方法(该方法可能存在或可能不存在)。

因此,您必须引导解析器避免这些歧义。您可以使用第二个示例中的显式接收器,也可以使用send(:next)之类的构造