Forum: Ruby on Rails how to monkeypatch Hash's []= method

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Harold (Guest)
on 2009-01-07 01:37
(Received via mailing list)
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
Frederick C. (Guest)
on 2009-01-07 01:49
(Received via mailing list)
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
Harold A. Giménez Ch. (Guest)
on 2009-01-07 01:57
(Received via mailing list)
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
Frederick C. (Guest)
on 2009-01-07 02:22
(Received via mailing list)
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
Harold A. Giménez Ch. (Guest)
on 2009-01-07 04:39
(Received via mailing list)
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
This topic is locked and can not be replied to.