How to monkeypatch Hash's []= method


#1

I’m trying to monkeypatch the []= method in the Hash class:

Hash.class_eval do
def []_with_feature=(a,b)
puts ‘foo’
end
alias_method_chain :[]=, :feature
end

Something is wrong with the syntax, but I can’t figure out what. The
alias_method_chain method does look for punctuation (= in this case)
and expects it to be at the end of the aliased method ([]
_with_feature=), but I get the following syntax error:

SyntaxError: compile error
(irb):5: syntax error, unexpected ‘)’, expecting ‘=’
(irb):7: syntax error, unexpected kEND, expecting ‘)’
(irb):9: syntax error, unexpected kEND, expecting ‘)’

Any ideas?

Thanks,
-H


#2

On 6 Jan 2009, at 23:36, Harold wrote:

I’m trying to monkeypatch the []= method in the Hash class:

doesn’t seem to be anything to do with alias_method_chain - just
sticking
def []_with_feature=(a,b)
puts ‘foo’
end

into irb causes similar errors. You’ll just have to skip alias method
chain this time.

Fred


#3

Thanks for the response.

So how in the world is this implemented? The []= method’s source code is
in
C. Other classes override it in a subclass, which works fine, but how
would
I go about implementing a method that works like the Hash class’ []=
method?

I’m not sure what you mean by “skipping alias_method_chain” this time.
If I
do

alias :[]_without_feature=, :[]=
alias :[]=, :[]_with_feature

I get the same error, as expected. So how would I go about changing this
method’s behavior?

Thanks again,
-H

On Tue, Jan 6, 2009 at 6:49 PM, Frederick C.
<removed_email_address@domain.invalid


#4

On 6 Jan 2009, at 23:56, Harold A. Giménez Ch. wrote:

alias :[]_without_feature=, :[]=
alias :[]=, :[]_with_feature

I get the same error, as expected. So how would I go about changing
this method’s behavior?

just call it square_bracket_without feature or something like that.
the problem isn;t the method aliasing it’s defining a method called
[]_with_feature=

Fred


#5

I was focusing on the “=” being the problem… Worked nicely. Many
thanks!

On Tue, Jan 6, 2009 at 7:20 PM, Frederick C.
<removed_email_address@domain.invalid