Robert Klemme
2/7/2007 10:05:00 PM
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