我能理解这一点:
iex(7)> outside_val = 5
5
iex(8)> print = fn() -> IO.puts(outside_val) end
#Function<20.90072148/0 in :erl_eval.expr/5>
iex(9)> print.()
5
:ok
Run Code Online (Sandbox Code Playgroud)
我没有得到这么多,为什么Elixir允许定义打印功能,即使没有定义outside_val,只是稍后出错?无论如何在定义闭包之后无法传入'outside_val',因此Elixir在创建过程中检查变量是否存在更好?
我的意思是:
iex(2)> print = fn () -> IO.puts(outside_val) end
#Function<20.90072148/0 in :erl_eval.expr/5>
iex(3)> outside_val = 5
5
iex(4)> print.()
** (RuntimeError) undefined function: outside_val/0
Run Code Online (Sandbox Code Playgroud)
Jos*_*lim 10
这是Elixir中的一个错误,它将在v1.1中修复(已在主分支中):
Interactive Elixir (1.1.0-dev) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> print = fn () -> IO.puts(outside_val) end
** (CompileError) iex:1: undefined function outside_val/0
Run Code Online (Sandbox Code Playgroud)
当前实现延迟扩展以调用函数IEx.Helpers.在master中,我们只是导入IEx.Helpers,因此我们不再需要outside_val稍后扩展.