如何创建一个字符串模板:"一些字符串{some_stub_var}"?

时间:2017-06-03 04:57:19

标签: elixir

我想在其中创建一个存根模板:

  my_str_template = "some string {some_stub_var}"
  # note that there's no variable "some_stub_var" in the current scope

所以,稍后在我的申请中,我可以做这样的事情:

my_str = my_str_template.format(some_stub_var: "my_real_string_var_123")

1)怎么做?

2)它叫什么?

3 个答案:

答案 0 :(得分:3)

您可以将Regex.replace/3与函数回调一起用于简单的字符串插值:

defmodule A do
  def format(string, bindings) do
    Regex.replace(~r/\{(\w+?)\}/, string, fn _, var -> bindings[String.to_existing_atom(var)] end)
  end
end

my_str_template = "some string {some_stub_var}"
IO.puts A.format(my_str_template, some_stub_var: "my_real_string_var_123")

输出:

some string my_real_string_var_123

您也可以使用EEx。最简单的方法是使用EEx.eval_string/2

my_str_template = "some string <%= some_stub_var %>"
IO.puts EEx.eval_string(my_str_template, some_stub_var: "my_real_string_var_123")

更有效的方法是使用EEx.function_from_string在编译时将模板编译为函数,但对于这种简单的单行模板来说,这可能过于繁琐。

答案 1 :(得分:2)

听起来像是在寻找模板语言。

有很多。一个相当简单的称为mustache

bbmustacheerlang中的实现。

您可以将其添加到混音文件中,如下所示:

  defp deps do
    [
      {:bbmustache, "~> 1.4"},
    ]
  end

并运行mix deps.get进行安装。

用法示例:

iex(1)> :bbmustache.render("Hello {{who}}", %{ 'who' => "world" })
"Hello world"

这个库的一个障碍是地图中的键必须是字符列表(单引号)。

答案 2 :(得分:0)

您可以使用EEx

EEx.eval_string("foo <%= bar %>", bar: "baz")