为什么 `next` 没有被列为 `Enumerator` 类的方法?

see*_*ker 2 ruby methods

Enumerator的文档页面上列出了以下方法:

  • ::new
  • #each
  • #each_with_index
  • #each_with_object
  • #feed
  • #inspect
  • #next
  • #next_values
  • #peek
  • #peek_values
  • #rewind
  • #size
  • #with_index
  • #with_object

但是,当我在irb收到以下内容时false

>> Enumerator.methods.include?(:next)
false
Run Code Online (Sandbox Code Playgroud)

这是因为即使该方法可以用于此类的实例,但该方法并未在类本身上显式定义,即它是继承的?考虑到这一点,我还检查了Enumerator超类,发现它们也不包含此方法:

>> Enumerator.superclass.methods.include?(:next)
false
>> Enumerator.superclass.superclass.methods.include?(:next)
false
Run Code Online (Sandbox Code Playgroud)

我确定我忽略了一些非常基本的东西。

Rup*_*ton 5

#next是 Enumerator 类的实例方法。使用Enumerator.instance_methods.include?(:next)将返回true

  • 此外,“#instance_methods”会查找祖先链中的方法,除非您提供可选参数“false”https://apidock.com/ruby/Module/instance_methods (3认同)
  • 探索者,如果您希望使用“methods”而不是“instance_methods”,请在“Enumerator”的实例上调用它,例如“enum = [1,2,3].each #=> #<Enumerator: [1, 2, 3]:each>`: `enum.methods.include?(:next) #=> true`。 (2认同)
  • 同样,`Integer.instance_methods.include?(:+) #=> true` 和 `42.methods.include?(:+) #=> true`。进一步@Rupert的观点,这里是一个如何在祖先链中找到定义方法的*位置*的示例:`Integer.instance_method(:zero?).owner #=> Numeric`(或`42.method( :零?).owner #=> 数字`). (2认同)