# Gsub does not work with do/end block, only brackets

**URL:** <https://www.ruby-forum.com/t/gsub-does-not-work-with-do-end-block-only-brackets/117881>\
**Category:** Ruby\
**Created:** [October 22, 2007, 2:45am UTC](https://www.ruby-forum.com/t/gsub-does-not-work-with-do-end-block-only-brackets/117881 "2007-10-22T02:45:49Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![mcampbell](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/8e7dd6/32.png) [@mcampbell](https://www.ruby-forum.com/u/mcampbell)\
**Post date:** [October 22, 2007, 2:45am UTC](https://www.ruby-forum.com/t/gsub-does-not-work-with-do-end-block-only-brackets/117881/1 "2007-10-22T02:45:49Z")

</div>

puts “abcdefg”.gsub(/abc/) do |x|  
x.upcase  
end

^This does not work. ArgumentError, it’s expecting the second argument  
that’s required when a block is not provided.

puts “abcdefg”.gsub(/abc/) { |x|  
x.upcase  
}

^This works.

Why??

---

<div class="post-metadata">

**Author:** ![mcampbell](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/8e7dd6/32.png) [@mcampbell](https://www.ruby-forum.com/u/mcampbell)\
**Post date:** [October 22, 2007, 3:31am UTC](https://www.ruby-forum.com/t/gsub-does-not-work-with-do-end-block-only-brackets/117881/2 "2007-10-22T03:31:25Z")

</div>

On 10/21/07, Michael C. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> ^This works.
> 
> Why??

Because {} binds tighter than do end

puts “abcdefg”.gsub(/abc/) do |x|  
x.upcase  
end

Is parsed as:

> puts “abcdefg”.gsub(/abc/) { |x|  
> x.upcase  
> }
> 
> ^This works.
> 
> Why??

Because {} binds tighter than do end

(puts (“abcdefg”.gsub(/abc/))) do |x|  
x.upcase  
end

Which means that the block is associated with the call to puts rather  
than gsub.

While

puts “abcdefg”.gsub(/abc/) { |x|  
x.upcase  
\ }

Is parsed as

## puts (“abcdefg”.gsub(/abc/) { |x| x.upcase \ })

Rick DeNatale

My blog on Ruby  
[http://talklikeaduck.denhaven2.com/](http://talklikeaduck.denhaven2.com/)

---

<div class="post-metadata">

**Author:** ![mcampbell](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/8e7dd6/32.png) [@mcampbell](https://www.ruby-forum.com/u/mcampbell)\
**Post date:** [October 22, 2007, 3:36am UTC](https://www.ruby-forum.com/t/gsub-does-not-work-with-do-end-block-only-brackets/117881/3 "2007-10-22T03:36:06Z")

</div>

Braces have high precedence, do end has low precedence so with

puts “abcdefg”.gsub(/abc/) do |x|  
x.upcase  
end

puts is being passed the block, whereas in

puts “abcdefg”.gsub(/abc/) { |x|  
x.upcase  
}

gsub is being passed the block. If you want to use do end, you can do  
something like

puts(“abcdefg”.gsub(/abc/) do |x|  
x.upcase  
end)

or

s = “abcdefg”.gsub(/abc/) do |x|  
x.upcase  
end  
puts s

---

<div class="post-metadata">

**Author:** ![mcampbell](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/8e7dd6/32.png) [@mcampbell](https://www.ruby-forum.com/u/mcampbell)\
**Post date:** [October 22, 2007, 3:44am UTC](https://www.ruby-forum.com/t/gsub-does-not-work-with-do-end-block-only-brackets/117881/4 "2007-10-22T03:44:24Z")

</div>

Fascinating, thanks.

---

<div class="post-metadata">

**Author:** ![mcampbell](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/8e7dd6/32.png) [@mcampbell](https://www.ruby-forum.com/u/mcampbell)\
**Post date:** [October 22, 2007, 3:37am UTC](https://www.ruby-forum.com/t/gsub-does-not-work-with-do-end-block-only-brackets/117881/5 "2007-10-22T03:37:52Z")

</div>

On 22 Oct 2007, at 09:45, Michael C. wrote:

> ^This works.
> 
> Why??

It interprets the block you are trying to give to ‘gsub’ as a block  
argument to ‘puts’ instead. Brackets remove the ambiguity:

irb(main):008:0\> “abc”.gsub(/a/){|x| x.upcase}  
=\> “Abc”  
irb(main):009:0\> “abc”.gsub(/a/) do |x| x.upcase end  
=\> “Abc”  
irb(main):010:0\> puts “abc”.gsub(/a/){|x| x.upcase}  
Abc  
=\> nil  
irb(main):011:0\> puts “abc”.gsub(/a/) do |x| x.upcase end  
ArgumentError: wrong number of arguments (1 for 2)  
from (irb):11:in `gsub’  
from (irb):11  
irb(main):012:0\> puts(“abc”.gsub(/a/) do |x| x.upcase end)  
Abc  
=\> nil

Alex G.

Bioinformatics Center  
Kyoto University
