pry命令系统
TL;DR
block_command不能处理选项,而class_command可以
使用block_command和class_command定义命令,可以享受helpers,而直接继承BlockCommand和ClassCommand则不行
command set可以另建,但最终还是要import到默认的set
Detail
在pry中定义命令,有两种做法。一种是block command,它实际执行时是不能带选项的

该方法源码如下

执行时直接将命令参数丢给block

而另一种则是class command,可以带选项调用。定义如下

源码如下

定义命令时所带的block只为充实Pry::ClassCommand类:定义process方法、定义可接受的选项……实际执行时就是调用所定义的process
由以上源码可见,block_command和create_command都会创建出新的命令子类,其实,class command的一般直接用继承语法来定义,例如:

在这种写法下,你需要自己调用add_command来把命令加入到某个CommandSet中,默认的就是以下这个。

当然你也可以另建command set来add_command,例如以下这个pry-rails的show-model命令

就使用了自建的command set。(注意,要使新建的command set生效,需要将其import到默认command set。因为命令的匹配只会在默认command set中查找)

那么另建command set的意义是什么呢?就是定义属于此set的helper方法

上述helpers所做的就是给set内的匿名module添加方法,然后在block_command和create_command时include到新的命令类上。
(注意,也就只有使用block形式而非继承形式时,才能自动将helper给include到命令类上。另外,默认command set也将拥有这些helpers)
