转载

Elixir交互式Shell: 4. 处理文件和脚本

这是 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 
原文  https://segmentfault.com/a/1190000004913296
正文到此结束
Loading...