2009-12-14 50 views
1

嗨,我想执行以下操作。我只是想重载[]方法来访问实例变量......我知道,它根本没有什么意义,但我想这样做是因为一些奇怪的原因:P在Ruby中使用重载括号[]的访问变量

它会是这样的......

class Wata 

    attr_accessor :nombre, :edad 

    def initialize(n,e) 
     @nombre = n 
     @edad = e 
    end 

    def [](iv) 
     self.iv 
    end 

end 

juan = Wata.new('juan',123) 

puts juan['nombre'] 

但是,这会引发以下错误:

overload.rb:11:`[]':未定义的方法 '四' 的#(NoMethodError)

我该怎么做?

编辑

我也发现了此解决方案:

def [](iv) 
    eval("self."+iv) 
end 

回答

8

变量和消息生活在一个不同的命名空间。为了将变量发送一个消息,你需要把它定义为两种:

def [](iv) 
    send iv 
end 

(如果你想通过访问来得到它)

def [](iv) 
    instance_variable_get "@#{iv}" 
end 

(如果你想直接访问伊娃)

+0

优秀查克!我不知道发送变量的任何内容... 它也适用于instance_variable_get 谢谢.. – flyer88 2009-12-14 20:29:38

+0

只发送方法的工作,attr_accessor为您添加setter和getter方法,所以发送基本上是调用getter。 – khelll 2009-12-14 20:35:42