2016-09-14 75 views
2

假設我構建使用sigil_S的字符串:如何評估或執行Elixir中的字符串插值?

iex> s = ~S(#{1 + 1}) 
"\#{1 + 1}" 

我如何再拿到藥劑,以評估字符串或進行插值,我彷彿進入了字面"#{1 + 1}"

換句話說,我如何得到它評估到"2"

我知道我可以用EEx代替(例如EEx.eval_string "<%=1 + 1%>"),但我很好奇是否有辦法使用'普通'字符串插值來實現。

回答

4

小寫sigils支持插值。更多關於它here

如果sigil是小寫字母(如sigil_x),那麼字符串參數將允許插值。如果sigil是大寫(如sigil_X),那麼該字符串將不會被插值。

所以,你可以使用印記~s到位,以評估插值:

~s(#{1 + 1}) #=> "2" 
~S(#{1 + 1}) #=> "\#{1 + 1}" 

或者,你可以簡單地使用字符串插值:

"#{1 + 1}" #=> "2" 

最後,如果你想要將你的代碼動態地寫入字符串變量,你可以使用Code.eval_string/3

s = "\"\#{1 + 1}\""    #=> "\"\#{1 + 1}\"" 
s |> Code.eval_string |> elem(0) #=> "2" 
+0

我想我的問題並不那麼清楚。我知道'〜s'。無論如何,我可以使用'Code.eval_string〜s(「#{s}」)'(注意多餘的引號)來做到這一點。我想要做的是多一點參與 - 基本上我希望能夠執行「EEx.eval_string/3」所做的事情,但使用字符串插值語法,例如'my_eval〜S(Hello,#{name}),[name:「world」]'。當定義了名字但是Code.eval_string〜s(「#{s}」)'失敗並帶有'未定義函數名/ 0'時,'Code.eval_string〜s(「Hello,#{name}」)'起作用。還有什麼想法? –

+1

啊。 'Code.eval_string'也接受綁定。我能夠做我想做的事情:'Code.eval_string〜s(「#{s}」),[name:「world」]' –

0

您應該能夠使用Code模塊,它具有的功能eval_string所以才換出EExCode

Code.eval_string "1 + 1" 
0

雖然你可以使用Code.eval_string/3

{result, _} = Code.eval_string "1 + 1" 
result 
#⇒ 2 

單詞「插值」你用過的問題讓我想起你正在尋找簡單:

"#{1 + 1}" 
#⇒ "2" 

Sigil ~Sescapes給出的字符串,這就是爲什麼你有尖銳的符號逃脫。