Forum: Ruby Overload [] operator and use a block ?

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.
Stéphane Wirtel (Guest)
on 2007-02-28 22:22
(Received via mailing list)
Hi all,

I would like to know if it's possible to overload the [] operator to
use a block with it.

example:

class Test
   def []( x )
       # to do something here
       yield if block_given?
   end
end

t = Test.new
t['string'] do
    puts 'this is a test'
end

Thanks
Jason R. (Guest)
on 2007-02-28 22:34
(Received via mailing list)
Did you try to and find an error?

Jason
Robert K. (Guest)
on 2007-02-28 22:35
(Received via mailing list)
On 28.02.2007 21:15, Stéphane Wirtel wrote:
> end
>
> t = Test.new
> t['string'] do
>     puts 'this is a test'
> end

AFAIK it's not because the syntax does not allow a block with []:

irb(main):001:0> o=Object.new
=> #<Object:0x7ff96dc8>
irb(main):002:0> def o.[](x)
irb(main):003:1> yield x
irb(main):004:1> end
=> nil
irb(main):005:0> o[1] {|*a| p a}
SyntaxError: compile error
(irb):5: parse error, unexpected '{', expecting $
o[1] {|*a| p a}
       ^
         from (irb):5
         from :0

Kind regards

  robert
Gary W. (Guest)
on 2007-02-28 22:36
(Received via mailing list)
On Feb 28, 2007, at 3:21 PM, Stéphane Wirtel wrote:
> end
Not in Ruby 1.8.x but your example works just fine in Ruby 1.9.

The problem isn't with the definition of the method but in the
way the 1.8.x parser deals with the trailing block on the method
call.  The parser has been changed to recognize the block in 1.9.

Gary W.
Logan C. (Guest)
on 2007-02-28 22:39
(Received via mailing list)
On 2/28/07, Robert K. <removed_email_address@domain.invalid> wrote:
> >        yield if block_given?
> irb(main):001:0> o=Object.new
>          from (irb):5
>          from :0
>
> Kind regards
>
>         robert


Yep.

You can however do
t.send(:[], 'string') do
   puts "This kind of defeats the purpose"
end
Brian C. (Guest)
on 2007-02-28 23:01
(Received via mailing list)
On Thu, Mar 01, 2007 at 05:38:14AM +0900, Logan C. wrote:
> You can however do
> t.send(:[], 'string') do
>   puts "This kind of defeats the purpose"
> end

Or:

t.[]('string') { puts 'almost as bad' }
Stéphane Wirtel (Guest)
on 2007-02-28 23:30
(Received via mailing list)
thanks Gary

Stephane W.
This topic is locked and can not be replied to.