From: dblack@... Date: 2006-09-01T19:35:01+09:00 Subject: Re: Legal syntax, bug or what? Hi -- On Fri, 1 Sep 2006, Jonathan Maasland wrote: > 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 -- 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] http://www.manning.com/black | [3] http://www.rubypowerandlight.com [2] http://dablog.rubypal.com | [4] http://www.rubycentral.org