pry的基本运作

本质就是一个REPL(read、execute、print、loop)

不过会把输入输出高亮显示

也支持插件扩展,可对你输入的语句作特别处理

并且可以指定语句执行的上下文

binding.pry是什么?

pry有对Object作patch,使得(几乎)任何对象都拥有pry方法。

当在一个对象上调用pry时,你输入的命令实际上就是在该对象上用eval执行,因此你可以访问到该对象的实例变量

而binding是对当前调用栈(顶层)的封装,因此除了实例变量,你还可以访问到当前函数的局部变量

除了当前调用栈的局部变量,pry还会在eval你的命令前,给当前调用栈注入_file_、_dir_、_这样的局部变量

pry中的$、cd、ls是如何执行的?

在直接将你的语句eval之前,pry会先检查你的语句是否匹配pry自带命令。

若匹配,则将语句分词,去掉“命令”,把剩下实际要执行的东西丢给具体的命令类去做

否则当成普通语句执行

在shell中执行pry

若不带什么参数,则基本就是main_object.pry

为什么输入不完整的语句,可以换行继续输入完才执行?

见method_source-0.9.0/lib/method_source/code_helpers.rb。

catch(:valid){  eval("BEGIN{throw :valid}\n#{str}")  }

语句在执行前先做语法检查,如果语法ok,则执行BEGIN{throw :valid}中止该语句执行,并返回true,告知pry可以执行

否则暂存语句,与往后读到的语句拼接,在按上述步骤检查是否应该执行

源码分析