浅谈pry
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可以执行
否则暂存语句,与往后读到的语句拼接,在按上述步骤检查是否应该执行
源码分析
