我想在其中创建一个存根模板:
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)它叫什么?
答案 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。
bbmustache是erlang
中的实现。
您可以将其添加到混音文件中,如下所示:
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")