2016-02-27 2 views
1

У меня есть класс, как показано ниже:Как работает `[] =` в Ruby?

class MyClass 
    def [](key) 
    '[] stub' 
    end 

    def []=(key, value) 
    '[]= stub' 
    end 

    def foo 
    self[:foo] #=>'[] stub' 
    end 

    def bar 
    self[:bar]= 'bar'#=> '[]= stub' 
    end 
end 

Есть ли способ переписать MyClass#foo и MyClass#bar методы без self?

+0

Почему бы вам не попробовать и не узнать? – pjs

+0

@pjs, я пробовал, никаких результатов. – Ilya

+0

Пожалуйста, отредактируйте, чтобы уточнить «... без самообеспечения»? Очевидно, вы должны явно ссылаться на 'self' (я сам) или неявно (используя' send', как объясняет @Stefan). –

ответ

2

Вы можете использовать send:

def foo 
    send(:[], :foo) 
end 

def bar 
    send(:[]=, :bar, 'bar') 
end 

Но я бы реализовать store и fetch вместо этого и определить [] и []= как псевдонимами:

def fetch(key) 
    # ... 
end 
alias_method :[], :fetch 

def store(key, value) 
    # ... 
end 
alias_method :[]=, :store 

И называют fetch/store вместо []/[]= от в пределах класса:

def foo 
    fetch(:foo) 
end 

def bar 
    store(:bar, 'bar') 
end 
Смежные вопросы