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)