2016-11-12 25 views
1

我在命令行接收一些参数。他们中的第一个告诉我必须创建什么样的uby对象来执行期望的动作。我这个参数存储在@entity,然后我做动态创建类时初始化出错

entity_class = "EmeraldFW::#{@entity.capitalize}".split('::').inject(Object) {|o,c| o.const_get c} 
entity_instance = entity.new(@arguments,@options) 
entity_instance.execute_command 

我歌厅一个错误,当我尝试创建这些实例中的一个,说项目创建这个类的一个实例。

我的项目类是

module EmeraldFW 

    class Project < EmeraldFW::Entity 

    def self.initialize(args,opts) 
     @valid_option = [ :language, :test, :database, :archetype ] 
     super(args,opts) 
    end 
. 
. 
. 

和我的实体类是

module EmeraldFW 

    class Entity 

    attr_accessor :entity_type, :valid_commands 

    def self.initialize(args,opts) 
     @args = args 
     @opts = clean_option(opts) 
    end 

. 
. 
. 

我的错误是

/home/edvaldo/software/github/emeraldfw21/lib/emeraldfw.rb:41:in `initialize': wrong number of arguments (given 2, expected 0) (ArgumentError) 

,我不知道为什么会这样。正如你可能看到的,初始化接收两个参数,并根据需要给了它两个参数。

也许因为我在看这个很长一段时间,但我只是看不到原因。有人会帮助我吗?

回答

2

这是因为你的initialize方法被写为“class”方法(class'singleton方法),而它应该是一个实例方法。由于这一事实原来initialize方法,你用new呼吁:

entity_instance = entity.new(@arguments,@options) 

带任何参数。

要解决该问题self.initialize方法定义删除self.部分。


class Foo 
    def initialize(bar, baz) 
    @bar = bar 
    @baz = baz 
    end 
end 

Foo.new(:bar, :baz) 
#=> #<Foo:0x007fa6d23289a0 @bar=:bar, @baz=:baz>