2016-02-27 39 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#fooMyClass#bar方法,而沒有self

+0

你爲什麼不嘗試一下,找出答案? – pjs

+0

@pjs,我試過了,沒有結果。 – Ilya

+0

請編輯澄清「...沒有自我存在」?顯然你必須明確地(self.')或隱式地引用'self'(使用'send',就像@Stefan解釋的那樣)。 –

回答

2

你可以使用send

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

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

不過,我想實現storefetch代替,並定義[][]=的別名:

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