2017-06-03 2 views
0

Ich mag es mit einer Stub-Vorlage erstellen:Wie erstellt man eine String-Vorlage: "eine Zeichenfolge {some_stub_var}"?

my_str_template = "some string {some_stub_var}" 
    # note that there's no variable "some_stub_var" in the current scope 

So, dass irgendwann später in meiner Anwendung, so etwas zu tun, ich bin in der Lage:

my_str = my_str_template.format(some_stub_var: "my_real_string_var_123") 

1) Wie zu tun Das?

2) Wie heißt es?

Antwort

3

Sie können Regex.replace/3 mit einer Callback-Funktion für einfache String-Interpolation verwenden:

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") 

Ausgang:

some string my_real_string_var_123 

Sie können EEx auch für diesen. Der einfachste Weg ist EEx.eval_string/2 zu verwenden:

my_str_template = "some string <%= some_stub_var %>" 
IO.puts EEx.eval_string(my_str_template, some_stub_var: "my_real_string_var_123") 

Die effizientere Art und Weise ist EEx.function_from_string zu verwenden, um die Vorlagen zu kompilieren bis auf Funktionen zum Zeitpunkt der Kompilierung, aber es könnte für eine solche einfache einzelne Zeile Vorlagen zu umständlich.

+0

das sind Hacks, das will ich nicht. – Jodimoro

0

Klingt, als ob Sie nach einer Templating-Sprache suchen.

Es gibt viele. Ein ziemlich einfaches heißt mustache.

bbmustache ist eine Implementierung in erlang.

Sie können es zu einem Mix-Datei hinzufügen wie folgt:

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

und führen mix deps.get zu installieren.

Anwendungsbeispiel:

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

Ein bisschen ein Haken für diese Bibliothek ist, dass die Schlüssel in der Karte muss charlists (Einzel zitiert) sein.

Verwandte Themen