# Overload \[\] operator and use a block?

**URL:** <https://www.ruby-forum.com/t/overload-operator-and-use-a-block/87202>\
**Category:** Ruby\
**Created:** [February 28, 2007, 9:22pm UTC](https://www.ruby-forum.com/t/overload-operator-and-use-a-block/87202 "2007-02-28T21:22:13Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![StSSSSphane\_Wirtel](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/9fc348/32.png) [@StSSSSphane\_Wirtel](https://www.ruby-forum.com/u/StSSSSphane_Wirtel)\
**Post date:** [February 28, 2007, 9:22pm UTC](https://www.ruby-forum.com/t/overload-operator-and-use-a-block/87202/1 "2007-02-28T21:22:13Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![StSSSSphane\_Wirtel](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/9fc348/32.png) [@StSSSSphane\_Wirtel](https://www.ruby-forum.com/u/StSSSSphane_Wirtel)\
**Post date:** [February 28, 2007, 9:34pm UTC](https://www.ruby-forum.com/t/overload-operator-and-use-a-block/87202/2 "2007-02-28T21:34:14Z")

</div>

Did you try to and find an error?

Jason

---

<div class="post-metadata">

**Author:** ![StSSSSphane\_Wirtel](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/9fc348/32.png) [@StSSSSphane\_Wirtel](https://www.ruby-forum.com/u/StSSSSphane_Wirtel)\
**Post date:** [February 28, 2007, 9:35pm UTC](https://www.ruby-forum.com/t/overload-operator-and-use-a-block/87202/3 "2007-02-28T21:35:15Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![StSSSSphane\_Wirtel](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/9fc348/32.png) [@StSSSSphane\_Wirtel](https://www.ruby-forum.com/u/StSSSSphane_Wirtel)\
**Post date:** [February 28, 2007, 9:39pm UTC](https://www.ruby-forum.com/t/overload-operator-and-use-a-block/87202/4 "2007-02-28T21:39:15Z")

</div>

On 2/28/07, Robert K. [removed\_email\_address@domain.invalid](mailto: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

---

<div class="post-metadata">

**Author:** ![StSSSSphane\_Wirtel](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/9fc348/32.png) [@StSSSSphane\_Wirtel](https://www.ruby-forum.com/u/StSSSSphane_Wirtel)\
**Post date:** [February 28, 2007, 9:36pm UTC](https://www.ruby-forum.com/t/overload-operator-and-use-a-block/87202/5 "2007-02-28T21:36:15Z")

</div>

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.

---

<div class="post-metadata">

**Author:** ![StSSSSphane\_Wirtel](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/9fc348/32.png) [@StSSSSphane\_Wirtel](https://www.ruby-forum.com/u/StSSSSphane_Wirtel)\
**Post date:** [February 28, 2007, 10:30pm UTC](https://www.ruby-forum.com/t/overload-operator-and-use-a-block/87202/6 "2007-02-28T22:30:26Z")

</div>

thanks Gary

Stephane W.

---

<div class="post-metadata">

**Author:** ![StSSSSphane\_Wirtel](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/9fc348/32.png) [@StSSSSphane\_Wirtel](https://www.ruby-forum.com/u/StSSSSphane_Wirtel)\
**Post date:** [February 28, 2007, 10:01pm UTC](https://www.ruby-forum.com/t/overload-operator-and-use-a-block/87202/7 "2007-02-28T22:01:19Z")

</div>

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’ }
