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

时间:2016-09-14 06:56:26

标签: string elixir string-interpolation

假设我使用sigil_S构建一个字符串:

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

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

换句话说,如何让它评估为"2"

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

3 个答案:

答案 0 :(得分:5)

小写符号支持插值。关于它的更多信息here

  

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

因此,您可以使用sigil ~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"

答案 1 :(得分:0)

您应该能够使用具有Code功能的eval_string模块,因此只需将EEx替换为Code

Code.eval_string "1 + 1"

答案 2 :(得分:0)

虽然您可以使用Code.eval_string/3

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

你在问题​​中使用的“插值”这个词让我想到你在寻找简单:

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

Sigil ~S escapes给出的字符串,这就是为什么你有尖锐的符号逃脱。