Как вычислять строки в переменных - PullRequest
1 голос
/ 07 мая 2019

Я пытаюсь получить строку для оценки переменной. Может сделать это для функций, но не смог заставить работать переменные.

old_var = "nooook"

Atom.to_string(:old) <> "_var" |> Code.eval_string

ожидается:

nooook

фактический:

warning: variable "old_var" does not exist and is being expanded to "old_var()", please use parentheses to remove the ambiguity or change the variable name nofile:1

Ответы [ 4 ]

2 голосов
/ 07 мая 2019

Это не будет работать для локальных переменных из-за того, как они управляются.Code.eval_string/3 явно принимает привязку в качестве второго параметра, поэтому вы можете:

Code.eval_string(Atom.to_string(:old) <> "_var", old_var: "foo")

Sidenote: Code.eval_string/3 не следует использовать в коде клиента, если толькоты прекрасно понимаешь, почему ты это делаешь (и даже тогда этого следует избегать.)

1 голос
/ 07 мая 2019

Вы также можете использовать некоторые макросы для доступа к переменной (минуя Macro Hygiene .)

defmodule Variable do
  defmacro from_string(name) do
    quote do
      var!(unquote({String.to_existing_atom(name), [], Elixir}))
    end
  end
end

Затем вы можете использовать макрос для установки / получения переменных:

iex> old_var = "nooook"
"nooook"
iex> require Variable
iex> Variable.from_string("old_var")
"nooook"
0 голосов
/ 09 мая 2019

Вы должны просто создать карту ваших строк и значений:

iex(17)> map = %{"old_var" => "nooook, "x" => 3, "y" => "hello"}
%{"old_var" => 10, "x" => 3, "y" => "hello"}

iex(18)> str = "old_var"                                   
"old_var"

iex(19)> map[str]
nooook

iex(20)> 
0 голосов
/ 07 мая 2019

Я не думаю, что таким образом вы можете получить доступ к переменным, определенным в оболочке.Вам необходимо связать переменные во втором параметре вызова eval_String как:

Code.eval_string "old_var", old_var: "noooook"
{"noooook", [old_var: "noooook"]}

Возвращенный кортеж будет иметь результат eval в качестве первой части и привязки в качестве второй.

...