如何创建字符串模板:"some string {some_stub_var}"?



我想在其中创建:

  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(叫什么?

您可以将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在编译时间将模板汇编为函数,但对于如此简单的单线模板来说可能太麻烦了。

听起来好像您正在寻找一种模板语言。

有很多。一个相当简单的称为小胡子。

bbmustache是erlang中的实现。

您可以将其添加到混合文件中:

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

并运行mix deps.get安装。

用法示例:

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

这个库的障碍是地图中的键必须是charlist(单个引用(。

您可以使用EEX

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

最新更新