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