如何在 Elixir 中评估或执行字符串插值?
How do I evaluate or execute string interpolation in Elixir?
假设我使用 sigil_S
:
构造一个字符串
iex> s = ~S(#{1 + 1})
"\#{1 + 1}"
然后如何让 Elixir 评估该字符串或执行插值,就好像我输入了文字 "#{1 + 1}"
?
换句话说,我怎样才能计算出 "2"
?
我知道我可以使用 EEx
来代替(例如 EEx.eval_string "<%=1 + 1%>"
),但我很好奇是否有办法只使用 'plain' 字符串插值来做到这一点。
您应该可以使用具有 eval_string
功能的 Code
模块,所以只需将 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 给定的字符串,这就是为什么你转义了尖锐的符号。
小写印记支持插值。更多信息 here:
If the sigil is lower case (such as sigil_x) then the string argument will allow interpolation. If the sigil is upper case (such as sigil_X) then the string will not be interpolated.
因此,您可以使用 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"
假设我使用 sigil_S
:
iex> s = ~S(#{1 + 1})
"\#{1 + 1}"
然后如何让 Elixir 评估该字符串或执行插值,就好像我输入了文字 "#{1 + 1}"
?
换句话说,我怎样才能计算出 "2"
?
我知道我可以使用 EEx
来代替(例如 EEx.eval_string "<%=1 + 1%>"
),但我很好奇是否有办法只使用 'plain' 字符串插值来做到这一点。
您应该可以使用具有 eval_string
功能的 Code
模块,所以只需将 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 给定的字符串,这就是为什么你转义了尖锐的符号。
小写印记支持插值。更多信息 here:
If the sigil is lower case (such as sigil_x) then the string argument will allow interpolation. If the sigil is upper case (such as sigil_X) then the string will not be interpolated.
因此,您可以使用 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"