首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于元编程的数字电路建模

基于元编程的数字电路建模
EN

Stack Overflow用户
提问于 2015-09-03 12:31:35
回答 1查看 43关注 0票数 0

我很难用元编程来建立一个简单的数字电路系统。

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

代码语言:javascript
复制
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?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-03 12:56:35

您在错误的对象上调用instance_variable_set。您正在对类本身执行此操作,而应该对该类的新实例执行该操作。

就像这样:

代码语言:javascript
复制
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>
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32375718

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档