我想在其中创建:
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")