扩展IRB以允许将未找到的方法“过滤”到我选择的方法中?

时间:2014-02-21 19:34:39

标签: ruby irb

在IRB启动时,我加载了很多自定义文件,模块和类来增强它。

我有一个课程可以帮助我很多,但我不知道如何自动调用它。在这种情况下自动意味着:当我启动IRB时,当我输入不是方法或变量的东西时,我想调用我自己选择的自定义方法。

我松散地知道这可以通过rescuemethod_missing完成,但我不确定要做哪一个。如果我输入IRB不知道的方法,如“foo”,有人可以告诉我如何在IRB(或irbrc)中调用方法吗?

2 个答案:

答案 0 :(得分:2)

我会选择不同的方法:

  • 将您需要的所有方法放入模块而不是类
  • 拥有对象include此模块
  • 使用foo.rb启动irb以始终自动加载您的定义

foo.rb:

module Foo
  def my_method
    puts "aye"
  end
end


class Object
  include Foo
end

现在,只要您在irb中输入my_method,它就会调用您的方法。

答案 1 :(得分:1)

这似乎很快会让人讨厌,但这就是你如何做到的。将其添加到您的.irbrc

def self.method_missing (name, *args, &block)                                   
  puts "#{name} is not a method, ya goof"                                       
end

显然,更改方法定义的内容以更改捕获缺失方法时会发生的情况。

现在每当你在irb中的main对象上调用一个方法时,它就会捕获丢失的方法。

>> foo
foo is not a method, ya goof
=> nil

这仅适用于顶级方法调用。如果您想要捕获每个缺少的方法调用,请改为添加:

class Object
  def method_missing (name, *args, &block)
    puts "#{self.class}##{name} is not a method, ya goof"
  end
end

请记住,这将向您揭示许多您可能甚至不知道的失败的方法调用。

$ irb
String#to_int is not a method, ya goof
>> foo
NilClass#to_ary is not a method, ya goof
Object#foo is not a method, ya goof
=> nil
>> [].bar
Array#bar is not a method, ya goof
=> nil

从长远来看,我认为这不会是你想要的东西,但这是怎么做的。自己敲门!