如何计算字符串到变量

时间:2019-05-07 06:47:37

标签: elixir

我正在尝试获取一个字符串来求值一个变量。可以对函数执行此操作,但无法使变量起作用。

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 个答案:

答案 0 :(得分:2)

这不适用于局部变量,因为它们的管理方式。 Code.eval_string/3明确接受绑定作为第二个参数,因此您可以:

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

边注: Code.eval_string/3不应在客户端代码中使用,除非您完全理解为什么要这样做(即使这样做也应该避免。)

答案 1 :(得分:1)

您还可以做一些宏魔术操作来访问变量(绕过Macro Hygiene。)

Model

然后您可以使用宏来设置/获取变量:

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

答案 2 :(得分:0)

我不认为您可以通过这种方式访问​​Shell中定义的变量。您需要将eval_String调用的第二个参数中的变量绑定为:

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

返回的元组将把eval的结果作为第一部分,并将绑定的结果作为第二部分。

答案 3 :(得分:0)

您应该只创建一个字符串和值的映射:

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