我很难用元编程来建立一个简单的数字电路系统。
其思想是将类方法(如“输入”、“输出”)添加到电路类中。每个新的电路模型(比如说Adder )都继承了电路。当实例化这样的电路时,我应该能够按其名称访问它的输入,并获得相应的对象(输入实例)。让我们举例说明:
class Input
attr_accessor :name, :value
def initialize name
@name = name
@value=nil
end
end
class Circuit
def self.input name
send(:attr_accessor, name)
var_name = "@#{name}"
self.instance_variable_set(var_name, Input.new(name)) #no effect...
end
end
class Adder < Circuit
input :a
input :b
# output :f
end
p adder = Adder.new
p adder.a #Should be an Input instance, whose name attribute is :a到目前为止,我只是动态地为命名端口添加了正确的访问器。
我应该使用class_eval、instance_eval还是define_method?
发布于 2015-09-03 12:56:35
您在错误的对象上调用instance_variable_set。您正在对类本身执行此操作,而应该对该类的新实例执行该操作。
就像这样:
class Circuit
def self.input(name)
send(:attr_accessor, name)
# take note of this new input, we'll use it later
@_inputs ||= []
@_inputs << name
end
def initialize
# instantiate all defined inputs
self.class.instance_variable_get(:@_inputs).each do |name|
send("#{name}=", Input.new(name))
end
end
end
class Adder < Circuit
input :a
input :b
end
t = Adder.new
t.a # => #<Input:0x007f9664077ea0 @name=:a, @value=nil>https://stackoverflow.com/questions/32375718
复制相似问题