Как мне избежать # {от строковой интерполяции - PullRequest
11 голосов
/ 21 августа 2009

У меня есть heredoc, где я использую #{} для интерполяции некоторых других строк, но есть случай, когда я также хочу записать фактический текст #{some_ruby_stuff} в мой heredoc, БЕЗ его интерполяции. Есть ли способ избежать # {.

Я пробовал "\", но не повезло. Хотя он избегает #{}, он также включает "\":

>> <<-END
 #{RAILS_ENV} \#{RAILS_ENV} 
END
=> " development \#{RAILS_ENV}\n"

Ответы [ 3 ]

19 голосов
/ 22 августа 2009

Для heredoc без необходимости избегать всех ваших возможных интерполяций вы можете использовать heredoc с одинарной кавычкой. Это работает так:

item = <<-'END'
  #{code} stuff
  whatever i want to say #{here}
END
18 голосов
/ 21 августа 2009

Я думаю, что обратная косая черта - это просто Ruby, полезный каким-то образом только для irb.

>> a,b = 1,2        #=> [1, 2]
>> s = "#{a} \#{b}" #=> "1 \#{b}"
>> puts s           #=> 1 #{b}
>> s.size           #=> 6

Так что я думаю, что у вас уже есть правильный ответ.

4 голосов
/ 21 августа 2009

Вместо этого вы можете использовать ' кавычки. Все, что в них заключено, не интерполируется.

Ваше решение с экранированием # также работает для меня. Действительно переводчик Ruby показывает

=> "\#{anything}"

но

> puts "\#{anything}"
#{anything}
=> nil

Ваша строка включает в себя именно то, что вы хотели, только метод p показывает это с escape-символами. Фактически, метод p показывает вам, как должна быть записана строка, чтобы получить точно объект, представленный его параметром.

...