如何在Elixir中评估或执行字符串插值?

Ali*_*ael 3 string elixir string-interpolation

假设我使用sigil_S以下方法构造一个字符串

iex> s = ~S(#{1 + 1})
"\#{1 + 1}"
Run Code Online (Sandbox Code Playgroud)

然后我如何让Elixir评估该字符串或执行插值,就像我输入了字面值一样"#{1 + 1}"

换句话说,我该如何评价"2"呢?

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

Vit*_*upt 6

小写符号支持插值.更多关于它在这里:

如果sigil是小写(例如sigil_x),则字符串参数将允许插值.如果sigil是大写(例如sigil_X),则不会插入字符串.

因此,您可以使用sigil ~s来评估插值:

~s(#{1 + 1}) #=> "2"
~S(#{1 + 1}) #=> "\#{1 + 1}"
Run Code Online (Sandbox Code Playgroud)

或者你可以简单地使用字符串插值:

"#{1 + 1}" #=> "2"
Run Code Online (Sandbox Code Playgroud)

最后,如果要评估动态写入字符串变量的代码,可以使用Code.eval_string/3:

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

  • 啊。`Code.eval_string` 也接受绑定。我能够做我想做的事情:`Code.eval_string ~s("#{s}"), [name: "world"]` (2认同)