为什么类对象可以访问内核模块中的实例模块?

时间:2016-09-27 08:46:59

标签: ruby module

我学习Ruby并且最近发现了一些我不太了解的东西。将模块混合到Classes中时,类Object无法访问模块实例方法。

module Swimmable
  def swim
    puts 'can swim'
  end
end

class Fish
  include Swimmable
end

Fish.swim

结果是预期的undefined method 'swim' for Fish:Class (NoMethodError)

但是,如果在Kernel模块中定义了实例方法,我可以使用类对象和实例对象来访问它。

module Kernel
  def swim
    puts 'can swim'
  end
end

class Fish; end

Fish.swim # => can swim
Fish.new.swim # => can swim

是什么让类对象Fish能够访问内核模块中的实例方法?

1 个答案:

答案 0 :(得分:1)

来自the documentation

  

内核模块包含在Object类中,因此它的方法在每个Ruby对象中都可用。

Fish个实例和Fish类本身都是对象,因此它们具有Kernel中定义的所有方法。

在第一种情况下,您会收到错误,因为在Swimmable中加入Fish会使Swimmable成员在Fish的实例上可用,但不会在类本身上。< / p>