我想做点什么
module MyStuff
def my_method
end
end
class Module
include MyStuff
end
但在某种程度上我可以做到
module SomeModule
my_method
end
但不是
class SomeClass
my_method
end
由于Class
继承自Module
,我怀疑它很棘手,没有明确地定义模块的方法。但也许这是唯一的方法?
答案 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