Доступ к переменным с использованием перегрузочных скобок [] в Ruby - PullRequest
1 голос
/ 14 декабря 2009

Привет, я хочу сделать следующее. Я просто хочу перегрузить метод [] для доступа к переменным экземпляра ... Я знаю, это не имеет большого смысла, но я хочу сделать это по какой-то странной причине:

Это будет что-то вроде этого ...

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: в `[] ': неопределенный метод' iv 'для # (NoMethodError)

Как я могу это сделать?

EDIT

Я нашел также это решение:

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

Ответы [ 2 ]

8 голосов
/ 14 декабря 2009

Переменные и сообщения находятся в другом пространстве имен. Чтобы отправить переменную в виде сообщения, вам необходимо определить ее как:

def [](iv)
    send iv
end

(если вы хотите получить его через аксессор)

или

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

(если вы хотите получить прямой доступ к ивару)

4 голосов
/ 14 декабря 2009

попробуйте instance_variable_get вместо:

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