Overload [] operator and use a block?


#1

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
# to do something here
yield if block_given?
end
end

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

Thanks


#2

Did you try to and find an error?

Jason


#3

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.
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


#4

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


#5

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.


#6

thanks Gary

Stephane W.


#7

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. { puts ‘almost as bad’ }