我可以将模块级方法混合到模块中而不是类中吗?

时间:2015-03-08 14:41:24

标签: ruby

我想做点什么

module MyStuff
  def my_method
  end
end

class Module
  include MyStuff
end

但在某种程度上我可以做到

module SomeModule
  my_method
end

但不是

class SomeClass
  my_method
end

由于Class继承自Module,我怀疑它很棘手,没有明确地定义模块的方法。但也许这是唯一的方法?

1 个答案:

答案 0 :(得分:1)

你能做到的一种方法是依靠继承:

http://ruby-doc.org/core-2.2.0/Class.html#method-i-inherited

当您继承时,您可以根据您可能拥有的任何条件动态定义或取消定义该方法。

你可以采取的另一种方法是继承两者的方法,并在方法内部查看你所在的实体,并且根本不对类做什么。

只有2个选项。可能还有几个让我失望。

<强>更新

对于您使用的模块,包括:http://ruby-doc.org/core-2.2.0/Module.html#method-i-included

虽然精神是一样的。

这是一个完整的例子:

#!/usr/bin/env ruby
module BaseModule
    def self.included(subclass)
        if subclass.name.eql?("A")
            subclass.send(:define_method, "method1") do
                puts "Method1 in #{subclass.name}"
            end
        end
    end
end

class A 
    include BaseModule 
end

class B
    include BaseModule
end


A.new.method1
B.new.method1

B.new.method1会抱怨它没有方法1

<强> UPDATE2

重读问题,这是我希望的最终解决方案(它建立在之前的基础上):

#!/usr/bin/env ruby
module BaseModule
    def self.included(sub)
        return if sub.kind_of? Class
        sub.send(:define_method, "method1") do
            puts "Method1 in #{sub.name}"
        end
    end
end

module SomeModule
    include BaseModule
end

class A 
    include SomeModule 
end

class B
    include BaseModule
end


A.new.method1
B.new.method1

A将有方法1,因为它包含来自SomeModule的定义。 B不会尝试直接从BaseModule执行此操作。

<强> UPDATE3

  

使用附带的内容非常聪明。这里的问题是我想要的   my_method可以自动在每个模块中使用,但不能在   根据问题中的例子,任何类。真实的,非简化的   我想解决的问题是我想要混合一大堆   模块级/类级方法进入所有模块,以及所有模块   对象派生类,但不是BasicObject(Object继承   从)

您可以通过以下方式执行此操作:

#!/usr/bin/env ruby

module UberModule
    def make_it_so
        puts "make_it_so in #{self.class}"
    end
end

class Module
    include UberModule    
end

class Class
    undef_method :make_it_so
end

module TestModule
end

class Test
end

TestModule::make_it_so
Test.new.make_it_so