所以我在ruby中尝试mixins和一些元编程,并且无法让这个对我起作用。我想要它打印“狒狒”
module A
def self.included(base)
base.extend ClassMethods
end
module ClassMethods
def install_A
include InstanceMethods
end
end
module InstanceMethods
class B
def testB
#What goes here???
A.monkey
end
end
attr_accessor :monkey
def initialize()
@monkey = "baboon"
end
def test
b = B.new
puts b.testB
end
end
end
class Chimp
include A
install_A
end
c = Chimp.new
c.test
答案 0 :(得分:4)
B
是它自己独立的类。它没有与任何其他类或模块关联或连接,除非说B
的实例恰好在InstanceMethods::test
内创建。在class B
的定义中声明module InstanceMethods
会限制B
的范围,使其在InstanceMethods
之外不可见,但它不会连接B
和InstanceMethods
以任何方式。
您需要的是在B
内显示模块的变量。您可以为initialize
实现一个带有参数的B
方法,InstanceMethods::test
可以使用b = B.new(@monkey)
将值传递给B
(确保{{1}将值存储为实例变量。)