How to monkeypatch Hash's []= method

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

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

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.
<[email protected]

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

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

On Tue, Jan 6, 2009 at 7:20 PM, Frederick C.
<[email protected]