我正在尝试获取一个字符串来求值一个变量。可以对函数执行此操作,但无法使变量起作用。
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
答案 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)>