Legal syntax, bug or what?

Hi all,

I'm still working on Ripper and during my explorations I came across a line of code in mkmf.rb that I can't wrap my head around.

Line 1313

···

---
    opts = $arg_config.collect {|t, n| "\t#{t}#{"=#{n}" if n}\n"}
---

When I copy-paste the entire method to a file and run it through Ruby everything is fine.
However irb doesn't accept the method:
----
irb(main):001:0> def mkmf_failed(path)
irb(main):002:1> unless $makefile_created or File.exist?("Makefile")
irb(main):003:2> opts = $arg_config.collect {|t, n| "\t#{t}#{"=#{n}" if n}\n"}
irb(main):004:3* abort "*** #{path} failed ***\n" + FailedMessage + opts.join
irb(main):005:3> end
irb(main):006:2> end
irb(main):007:1>
------
As you can see irb doesn't detect the end of the third line.

After taking the statement apart and simplifying it, it all boils down to the following construction:
#{"=#{n}" if n}
inside the ""main"" double-quoted string.

Why does ruby accept this construct while irb doesn't?
Doesn't Ruby see the first double-quote as the end of the string?

Any clarification would be greatly appreciated.

With kind regards
Jonathan Maasland

Hi --

Hi all,

I'm still working on Ripper and during my explorations I came across a line of code in mkmf.rb that I can't wrap my head around.

Line 1313
---
  opts = $arg_config.collect {|t, n| "\t#{t}#{"=#{n}" if n}\n"}
---

When I copy-paste the entire method to a file and run it through Ruby everything is fine.
However irb doesn't accept the method:
----
irb(main):001:0> def mkmf_failed(path)
irb(main):002:1> unless $makefile_created or File.exist?("Makefile")
irb(main):003:2> opts = $arg_config.collect {|t, n| "\t#{t}#{"=#{n}" if n}\n"}
irb(main):004:3* abort "*** #{path} failed ***\n" + FailedMessage + opts.join
irb(main):005:3> end
irb(main):006:2> end
irb(main):007:1>
------
As you can see irb doesn't detect the end of the third line.

After taking the statement apart and simplifying it, it all boils down to the following construction:
#{"=#{n}" if n}
inside the ""main"" double-quoted string.

Why does ruby accept this construct while irb doesn't?
Doesn't Ruby see the first double-quote as the end of the string?

Any clarification would be greatly appreciated.

Nested #{} are allowed, so this is some kind of irb parsing glitch.
It seems to be the = that's confusing irb for some reason:

irb(main):002:0> "#{"hello#{}"}"
=> "hello"
irb(main):003:0> "#{"hello=#{}"}"
irb(main):004:0*

I believe it's causing the second # to be interpreted as introducing a
comment.

David

···

On Fri, 1 Sep 2006, Jonathan Maasland wrote:

--
                   David A. Black | dblack@wobblini.net
Author of "Ruby for Rails" [1] | Ruby/Rails training & consultancy [3]
DABlog (DAB's Weblog) [2] | Co-director, Ruby Central, Inc. [4]
[1] Ruby for Rails | [3] http://www.rubypowerandlight.com
[2] http://dablog.rubypal.com | [4] http://www.rubycentral.org