为什么Ruby中的`next`方法会引发SyntaxError而``next!`或`self.next`在修补String类时不会这样做?

S.G*_*ami 3 ruby

以下代码工作正常:

class String
  def foo
    next!
  end
end

puts 'hh'.foo    # hi
Run Code Online (Sandbox Code Playgroud)

这个也很好:

class String
  def foo
    self.next
  end
end

puts 'hh'.foo    # hi
Run Code Online (Sandbox Code Playgroud)

但是这个没有:

class String
  def bar
    next
  end
end

# Invalid next (SyntaxError)
Run Code Online (Sandbox Code Playgroud)

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

Hol*_*ust 7

使用前两个示例,Ruby解析器确定您正在调用方法,因为next关键字不能以这种方式使用.

随着你第三个例子,它看起来像你正在使用next关键字,而不是调用一个方法.解析器在此阶段无法知道您实际上是要调用next方法(可能存在也可能不存在).

因此,您必须指导解析器以避免这些歧义.您可以使用一个明确的接收机作为你的第二个例子或使用构造,如send(:next)代替