2017-06-03 62 views
0

我想用一个存根模板以创建:如何创建一个字符串模板:“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)它叫什么?

回答

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编译模板到在编译时功能,但它可能是这样简单的单行模板太麻烦了。

+0

这些都是黑客,我不想那样。 – Jodimoro

0

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

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

bbmustacheerlang的实现。

你可以把它添加到您的混音文件像这样:

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

和运行mix deps.get安装。

用例:

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

此库一个障碍的一点是,在映射中的键必须是charlists(单引号)。

相关问题