From: jared@... Date: 2014-07-20T02:52:01+00:00 Subject: [ruby-core:63889] [ruby-trunk - Bug #9931] irb: Really weird behavior for x = "#{x\"}" (ex: irb(main:009:-4)) Issue #9931 has been updated by Jared Beck. Interesting. Let's try to figure it out! ## The irb prompt The prompt has two numbers. The first is obviously a line number, but what is the second number? irb(main):001:0> "#{ irb(main):002:0> end irb(main):003:-1> end irb(main):004:-2> do irb(main):005:-1> do irb(main):006:0> }" SyntaxError: (irb):2: syntax error, unexpected keyword_end (irb):6: unterminated string meets end of file from /Users/jared/.rbenv/versions/2.1.2/bin/irb:11:in `
' The second number seems to be a simple estimate of block depth. It must be implemented very simply, if it is capable of being negative. ## String interpolation is a block irb(main):013:0> "#{ irb(main):014:0> [1, 2, 3].map { |x| x * 2 } irb(main):015:0" }" => "[2, 4, 6]" It's just a block! We can put whatever we want in there. :) Note that on the third line, the prompt character changed from `>` to `"`, indicating (roughly) that `irb` thinks we're inside a string. ## The syntax error In the given example "#{x\"}" the string is closed at col. 5. The contents of the string are: #{x\ We can see that the interpolation block was not closed. So, the syntax error expecting '}' makes sense. ---------------------------------------- Bug #9931: irb: Really weird behavior for x = "#{x\"}" (ex: irb(main:009:-4)) https://bugs.ruby-lang.org/issues/9931#change-47916 * Author: Jesse Adkins * Status: Open * Priority: Normal * Assignee: * Category: * Target version: * ruby -v: ruby 1.9.3p484 (2013-11-22 revision 43786) [x86_64-linux] * Backport: 2.0.0: UNKNOWN, 2.1: UNKNOWN ---------------------------------------- # Our journey starts off rather simple: irb(main):001:0> x = "#{x}" => "" # Okay, makes sense. irb(main):002:0> x = "#{x\"}" irb(main):003:0" # Hmm...Still in a string? That's weird. irb(main):003:0" " irb(main):004:0> # Things seem back to normal but... irb(main):004:0> x # Nothing? But x is defined! irb(main):005:0> # Nothing? Hmm... irb(main):005:0> end irb(main):006:-1> end # Uhh...I don't think that's supposed to do that. irb(main):007:-2> end irb(main):008:-3> end irb(main):009:-4> # ...I'm afraid to go deeper. # Get me out of here! irb(main):009:-4> quit irb(main):010:-4> # O.O irb(main):010:-4> ^C irb(main):010:0> # ...Can I go now? irb(main):010:0> quit # Success! # Additionally, if I put this in a file: x = "#{x\"}" # I get two syntax errors (ruby 1.9.3): test.rb:1: syntax error, unexpected $undefined, expecting '}' x = "#{x\"}" ^ test.rb:1: syntax error, unexpected $end, expecting '}' x = "#{x\"}" ^ -- https://bugs.ruby-lang.org/