假設我構建使用sigil_S
的字符串:如何評估或執行Elixir中的字符串插值?
iex> s = ~S(#{1 + 1})
"\#{1 + 1}"
我如何再拿到藥劑,以評估字符串或進行插值,我彷彿進入了字面"#{1 + 1}"
?
換句話說,我如何得到它評估到"2"
?
我知道我可以用EEx
代替(例如EEx.eval_string "<%=1 + 1%>"
),但我很好奇是否有辦法使用'普通'字符串插值來實現。
假設我構建使用sigil_S
的字符串:如何評估或執行Elixir中的字符串插值?
iex> s = ~S(#{1 + 1})
"\#{1 + 1}"
我如何再拿到藥劑,以評估字符串或進行插值,我彷彿進入了字面"#{1 + 1}"
?
換句話說,我如何得到它評估到"2"
?
我知道我可以用EEx
代替(例如EEx.eval_string "<%=1 + 1%>"
),但我很好奇是否有辦法使用'普通'字符串插值來實現。
小寫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"
您應該能夠使用Code
模塊,它具有的功能eval_string
所以才換出EEx
爲Code
Code.eval_string "1 + 1"
雖然你可以使用Code.eval_string/3
:
{result, _} = Code.eval_string "1 + 1"
result
#⇒ 2
單詞「插值」你用過的問題讓我想起你正在尋找簡單:
"#{1 + 1}"
#⇒ "2"
Sigil ~S
escapes給出的字符串,這就是爲什麼你有尖銳的符號逃脫。
我想我的問題並不那麼清楚。我知道'〜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}」)'起作用。還有什麼想法? –
啊。 'Code.eval_string'也接受綁定。我能夠做我想做的事情:'Code.eval_string〜s(「#{s}」),[name:「world」]' –