这是 IEx系列
五部分中的第四部分, 在这一部分中, 我们将说明如何设置在IEx中处理文件和脚本
输入 h import_file
查看文档
iex(remote@localhost)2> h import_file Evaluates the contents of the file at path as if it were directly typed into the shell. ...
import_file
的作用是, 对导入的文件进行求值, 就像直接在shell中输入一样, 和复制一个文件的内容并粘贴到 IEx Shell
中的效果一模一样
有如下 test1.exs
文件:
fred = :fred defmodule Hello do def foo do "This is foo" end end IO.puts fred
iex(1)> import_file "test1.exs" fred :ok iex(2)> fred :fred iex(3)> Hello.foo "This is foo" iex(4)>
因为 import_file
是在IEx 导入的上下文进行求值
test2.exs
fred = :fred defmodule Hello do def foo do "This is foo" end end x10 = x * 10 # 现在 `x` 还没有定义
定义 x
, 并导入 test2.exs
iex(1)> x = 5 5 iex(2)> import_file import_file/2 iex(2)> import_file "test2.exs" 50 iex(3)> x10 50
我们看到 x10 = x * 10
的到了正确的结果 50
IEX -S
搜索 iex -s mix - 如果在一个 mix
项目中, 查找本地 mix.exs
否则
文件名必须包括扩展名
文件必须可执行
文件必须在路径中, 除非提供绝对路径
IEx.pry
IEx.pry
给我们提供了一个调试Elixir代码的能力. 我们能够在访问 IEx.pry
插入位置的作用域内的变量值. IEx.pry
让IEx进入了 IEx.pry
插入位置的 作用域
, 因此该作用域外部的变量, 在IEx中不能再访问了, 下面的例子说明了 IEx.pry
是如何工作的.
首先创建一个 pry.exs
文件
cat > pry.exs <<EOF require IEx fred = :fred defmodule Hello do def foo do x = 5 IEx.pry IO.puts "x is #{x}" end end EOF
iex(1)> bar = :bar :bar iex(2)> import_file "pry.exs" {:module, Hello, <<70, 79, 82, 49, 0, 0, 15, 24, 66, 69, 65, 77, 69, 120, 68, 99, 0, 0, 0, 126, 131, 104, 2, 100, 0, 14, 101, 108, 105, 120, 105, 114, 95, 100, 111, 99, 115, 95, 118, 49, 108, 0, 0, 0, 4, 104, 2, ...>>, {:foo, 0}} iex(3)> bar :bar iex(4)> fred :fred iex(5)> Hello.foo # 进入函数作用域 Request to pry #PID<0.62.0> at iex:7 Allow? [Yn] Y Interactive Elixir (1.2.1) - press Ctrl+C to exit (type h() ENTER for help) pry(1)> bar # 函数外部的变量不再可用 ** (UndefinedFunctionError) undefined function :erl_eval.bar/0 pry(1)> fred ** (UndefinedFunctionError) undefined function :erl_eval.fred/0 pry(1)> x # 显示foo函数作用域中的x值 5 pry(2)> x = 4 4 pry(3)> respawn # 结束`IEx.pry`会话返回上层IEx Shell Interactive Elixir (1.2.1) - press Ctrl+C to exit (type h() ENTER for help) x is 5 # 执行`IEx.pry`插入点后的代码, x的值没发生编号 :ok