【问题标题】:How do I evaluate or execute string interpolation in Elixir?如何在 Elixir 中评估或执行字符串插值?
【发布时间】:2016-09-14 20:04:34
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: string elixir string-interpolation


    【解决方案1】:

    小写字母支持插值。更多信息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"
    

    【讨论】:

    • 我想我的问题不是很清楚。我知道~s。无论如何,我可以使用Code.eval_string ~s("#{s}") 做到这一点(注意额外的引号)。我想要做的是更多的参与——本质上我希望能够做EEx.eval_string/3 所做的事情,但使用字符串插值语法,例如my_eval ~S(Hello, #{name}), [name: "world"]Code.eval_string ~s("Hello, #{name}") 在定义名称时有效,但 Code.eval_string ~s("#{s}") 失败并显示 undefined function name/0。还有什么想法吗?
    • 啊。 Code.eval_string 也接受绑定。我能够做我想做的事:Code.eval_string ~s("#{s}"), [name: "world"]
    【解决方案2】:

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

    Code.eval_string "1 + 1"
    

    【讨论】:

      【解决方案3】:

      虽然你可以使用Code.eval_string/3:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2014-08-27
        • 1970-01-01
        • 2021-12-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多