Supposons que je construis une chaîne en utilisant sigil_S
:
iex> s = ~S(#{1 + 1})
"#{1 + 1}"
Comment puis-je alors obtenir Elixir pour évaluer cette chaîne ou effectuer une interpolation, comme si j'avais entré le littéral "#{1 + 1}"
?
En d'autres termes, comment puis-je l'obtenir pour évaluer "2"
?
Je sais que je peux utiliser EEx
à la place (par exemple EEx.eval_string "<%=1 + 1%>"
) mais je suis curieux de savoir s’il est possible de le faire en utilisant simplement une interpolation de chaîne "simple".
Réponses:
5 pour la réponse № 1Les sceaux en minuscule prennent en charge l'interpolation. Plus à ce sujet ici:
Si le sigil est en minuscule (comme sigil_x), l'argument de chaîne autorisera l'interpolation. Si le sigil est en majuscule (comme sigil_X), la chaîne ne sera pas interpolée.
Donc, vous pouvez utiliser Sigil ~s
pour évaluer l'interpolation en place:
~s(#{1 + 1}) #=> "2"
~S(#{1 + 1}) #=> "#{1 + 1}"
Ou vous pouvez simplement utiliser une interpolation de chaîne:
"#{1 + 1}" #=> "2"
Et, enfin, si vous voulez évaluer votre code écrit dans une variable chaîne, vous pouvez utiliser Code.eval_string / 3:
s = ""#{1 + 1}"" #=> ""#{1 + 1}""
s |> Code.eval_string |> elem(0) #=> "2"
0 pour la réponse № 2
Vous devriez pouvoir utiliser le Code
module qui a la fonction eval_string
alors remplacez simplement EEx
pour Code
Code.eval_string "1 + 1"
0 pour la réponse № 3
Bien que vous puissiez utiliser Code.eval_string/3
:
{result, _} = Code.eval_string "1 + 1"
result
#⇒ 2
Le mot «interpolation» que vous avez utilisé dans la question me fait penser à ce que vous cherchiez simplement:
"#{1 + 1}"
#⇒ "2"
Sigil ~S
s'échappe la chaîne donnée, c’est pourquoi vous avez échappé au panneau.