Ruby 用元编程对数字电路建模

Ruby 用元编程对数字电路建模,ruby,metaprogramming,Ruby,Metaprogramming,我正在努力用元编程来模拟一个简单的数字电路系统 其思想是将类方法(如“输入”、“输出”)添加到电路类中。每个被建模的新电路(比如加法器)都继承了电路。当实例化这样一个电路时,我应该能够通过其名称访问其输入,并获得相应的对象(输入实例)。让我们举例说明: class Input attr_accessor :name, :value def initialize name @name = name @value=nil end end class Circuit

我正在努力用元编程来模拟一个简单的数字电路系统

其思想是将类方法(如“输入”、“输出”)添加到电路类中。每个被建模的新电路(比如加法器)都继承了电路。当实例化这样一个电路时,我应该能够通过其名称访问其输入,并获得相应的对象(输入实例)。让我们举例说明:

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
类输入
属性访问器:名称,:值
def初始化名称
@name=name
@值=零
结束
结束
类电路
def self.input名称
发送(:attr_访问者,名称)
var_name=“@#{name}”
self.instance_variable_set(var_name,Input.new(name))#无效。。。
结束
结束
类加法器电路
输入:a
输入:b
#产出:f
结束
p加法器=加法器。新
p adder.a#应该是一个输入实例,其name属性为:a
到目前为止,我只是为命名端口动态添加了正确的访问器


我应该使用class\u eval、instance\u eval还是define\u method?

您在错误的对象上调用了
instance\u variable\u 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>
类电路
def自我输入(名称)
发送(:attr_访问者,名称)
#注意这个新的输入,我们稍后会使用它
@_输入| |=[]
@_投入#

你不能。看看我的答案。