【发布时间】:2016-04-17 20:39:42
【问题描述】:
给定以下模块:
defmodule Foo do
def bar do
IO.puts "I'm bar"
end
def eval(quoted_code) do
Code.eval_quoted(quoted_code, [], __ENV__)
end
end
然后下面的代码会像预期的那样输出Foo:
# Outputs Foo
quote do
IO.inspect __MODULE__
end |> Foo.eval
那么为什么我不能从引用块内部调用Foo 中的其他函数呢?例如,下面的代码给了我一个CompileError:
# CompileError: undefined function bar/0
quote do
bar
end |> Foo.eval
但以下代码有效:
# Outputs "I'm bar"
quote do
import Foo
bar
end |> Foo.eval
import 语句到底在做什么?将Foo 导入Foo?这对我来说没有意义。
据我了解,Foo.eval 正在评估 Foo 模块上下文中的引用代码。但显然那是错误的,因为我不能在不使用 Foo. 前缀的情况下从 Foo 调用其他函数/宏。此外,我不明白import 语句如何/为什么起作用:当我已经在Foo 的上下文中时,为什么我需要import Foo?
这里发生了什么?感谢您的帮助!
【问题讨论】: