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

问题描述 投票:0回答:3

假设我使用

sigil_S
:

构造一个字符串
iex> s = ~S(#{1 + 1})
"\#{1 + 1}"

如何让 Elixir 评估该字符串或执行插值,就像我输入了文字

"#{1 + 1}"

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

"2"

我知道我可以使用

EEx
代替(例如
EEx.eval_string "<%=1 + 1%>"
),但我很好奇是否有一种方法可以仅使用“普通”字符串插值来做到这一点。

string elixir string-interpolation
3个回答
10
投票

小写字母支持插值。更多相关信息这里

如果印记是小写(例如 sigil_x),则字符串参数将允许插值。如果印记是大写(例如 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
投票

您应该能够使用具有

Code
功能的
eval_string
模块,因此只需将
EEx
替换为
Code

Code.eval_string "1 + 1"

1
投票

虽然您可以使用

Code.eval_string/3

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

您在问题中使用的“插值”一词让我认为您正在寻找简单的:

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

Sigil

~S
转义给定的字符串,这就是为什么你有尖锐的符号转义。

© www.soinside.com 2019 - 2024. All rights reserved.