2014-04-23 26 views
-2

假設s是包括插#{...}的一些事件,如字符串:如何轉義包含插值的Ruby字符串,以便稍後「評估」它?

s = " Hello #{Foo.bar(baz) + "}"} \n \" \\ World" 

什麼是逃避s使這一最簡單的方法:

eval("\"#{s.some_escape_method}\"") 

或等價

eval('"' + s.some_escape_method + '"') 

將在不影響s的情況下擴大插值s的任何其他部分,如字符",\n等?

+0

:由於s在這個例子中,需要叫name正確插值另一個字符串,讓我們定義第一? 'String#%'不會是一個更乾淨的解決方案嗎? –

+0

@ muistooshort你不能直接用'String#%'在字符串中放置代碼。 – sawa

+0

這通常是件好事。使用'%'也意味着你沒有脆弱的局部變量引用隱藏在你的字符串中。無論如何,'''真的是什麼樣子?在內插完成之後它是否包含'#{...}'*,或者是否想延遲對'Foo.bar(bas)+'}''的評估? –

回答

1

圍繞可能包含內插代碼字符串%q{},該字符串將任何內容進行字符串化並關閉插值。

讓我們來嘗試一個例子。下面是一些Ruby代碼中的字符串:

z = %q{s = "Hello #{"there, " + name + "!"}"} 
# => "s = \"Hello \#{\"there, \" + name + \"!\"}\"" 

如果我們EVAL z,我們將獲得包含s評估值的插值字符串。你爲什麼要使用`eval`這在所有

name = "Bob Smith" 
eval(z) 
# => "Hello there, Bob Smith!" 
+0

你在'%q {...}'內有's ='什麼?這是多餘的。 – sawa

+0

@sawa不,它不是。我正在分配給'z',而不是's'。 _evaluating_「z」的作用是將插值賦給's'。 –

+0

另外,你的答案是錯誤的。 'eval(%q {「\\」})'''''',我希望得到''\\「'。 – sawa

相關問題