【问题标题】:Why do class objects have access to instance modules in Kernel module?为什么类对象可以访问内核模块中的实例模块?
【发布时间】:2017-02-04 19:38:01
【问题描述】:

我正在学习 Ruby,最近发现了一些我不太了解的东西。将模块混入类时,类对象无法访问模块实例方法。

module Swimmable
  def swim
    puts 'can swim'
  end
end

class Fish
  include Swimmable
end

Fish.swim

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

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

module Kernel
  def swim
    puts 'can swim'
  end
end

class Fish; end

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

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

【问题讨论】:

  • 如果您希望Swimmable 可用于您的类对象,请在Fish 中写入extend Swimmable。这样就不需要在Kernel 中定义模块了。延伸阅读搜索词:单例类

标签: ruby module


【解决方案1】:

来自the documentation

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

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

在第一种情况下,您会收到错误,因为在 Fish 中包含 Swimmable 将使 Swimmable 成员在 Fish 的实例上可用,但在类本身上不可用。

【讨论】:

  • 感谢您的解释,它让我对ClassObject有了更深层次的理解。基本上每个 Class objectinstance object 都可以使用 Class Object 中的任何实例方法。
猜你喜欢
  • 2018-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多