Ruby:C类包含模块M;包括M中的模块N不影响C.什么给出?

前端之家收集整理的这篇文章主要介绍了Ruby:C类包含模块M;包括M中的模块N不影响C.什么给出?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
更详细地说,我有一个模块Narf,它为一系列类提供了基本功能.具体来说,我想影响继承Enumerable的所有类.所以我把Narf包含在Enumerable中.

Array是一个默认包含Enumerable的类.然而,它并没有受到Narf在模块中的后期加入的影响.

有趣的是,在包含之后定义的类从Enumerable获得Narf.

例:

# This module provides essential features
module Narf
  def narf?
    puts "(from #{self.class}) ZORT!"
  end
end

# I want all Enumerables to be able to Narf
module Enumerable
  include Narf
end

# Fjord is an Enumerable defined *after* including Narf in Enumerable
class Fjord
  include Enumerable
end

p Enumerable.ancestors    # Notice that Narf *is* there
p Fjord.ancestors         # Notice that Narf *is* here too
p Array.ancestors         # But,grr,not here
# => [Enumerable,Narf]
# => [Fjord,Enumerable,Narf,Object,Kernel]
# => [Array,Kernel]

Fjord.new.narf?   # And this will print fine
Array.new.narf?   # And this one will raise
# => (from Fjord) ZORT!
# => NoMethodError: undefined method `narf?' for []:Array

解决方法

您会想到两个解决问题的方法.他们都不是真的很漂亮:

a)浏览包含Enumerable的所有类,并使它们也包括Narf.像这样的东西:

ObjectSpace.each(Module) do |m|
  m.send(:include,Narf) if m < Enumerable
end

这虽然很狡猾.

b)直接将功能添加到Enumerable而不是自己的模块.这可能实际上是可以的,它会起作用.这是我推荐的方法,虽然它也不完美.

猜你在找的Ruby相关文章