From: Robert Klemme Date: 2007-02-08T07:10:09+09:00 Subject: Re: Defining << On 07.02.2007 22:58, Gary Wright wrote: > > On Feb 7, 2007, at 4:46 PM, Luke Ivers wrote: > >> I'm not 100% how exactly to search to find out if someone else has posed >> this question, but why does the following happen? >> >> Given: >> >> class Hash >> def << (key, val=nil) >> self.store(key, val) >> end >> end >> >> h = {} >> h << 'test' >> h << 'test', 'bob' > > The syntax rules for the << operator don't allow it to take multiple > arguments when called via infix notation: > > h << arg1 # one argument only > > you can call the method with multiple arguments but you've got to do it > like: > > h.<<(arg1, arg2) # dot-style method invocation > > You can use an array to 'cheat': > > h << [arg1, arg2] > > But the method will only see one argument, an array, and you would have > to expect that and/or test for it in your definition for Hash#<<. Here's another variant: class Hash Proxy = Struct.new :parent, :key do def <<(val) parent[key] = val parent end end def <<(key) Proxy.new self, key end end irb(main):012:0> h ={} => {} irb(main):013:0> h << "foo" << "bar" << "key" << 234 => {"foo"=>"bar", "key"=>234} irb(main):014:0> h << 2 << 3 => {2=>3, "foo"=>"bar", "key"=>234} irb(main):015:0> h => {2=>3, "foo"=>"bar", "key"=>234} Not that I would recommend it... Kind regards robert