2017-06-03 1 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と呼ばれています。

bbmustacheは、erlangの実装です。

あなたはそうのようなミックスファイルに追加することができます

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

してインストールするmix deps.getを実行します。

使用例:

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

このライブラリのひっかかりのビットマップのキーは(引用単一)charlistsなければならないことです。

関連する問題