来自Sinatra :: Base的Ruby类具有私有方法,但它们在irb控制台中消失

Cra*_*aig 2 ruby sinatra

我需要在一个从Sinatra :: Base子类化的Ruby类中访问某些私有方法中的某些功能.

类定义的开头如下:

class Geminabox < Sinatra::Base
Run Code Online (Sandbox Code Playgroud)

它从一系列代码块开始,如下所示:

  get '/' do
    @gems = load_gems
    @index_gems = index_gems(@gems)
    erb :index
  end
Run Code Online (Sandbox Code Playgroud)

其中'load_gems'和'index_gems'是稍后在同一个类中定义的私有方法.

但是,如果我将此类加载到irb控制台并创建如下的实例:

 g=Geminabox.new
Run Code Online (Sandbox Code Playgroud)

然后尝试查看我得到的私有方法:

> 2.2.1 :005 > g.private_methods(false)  
=> [:initialize] 
> 2.2.1 :006 >
Run Code Online (Sandbox Code Playgroud)

没有'load_gems',没有'index_gems'等等,我不能使用'send'调用其中任何一个:

2.2.1 :007 > g.send(:load_gems)
NoMethodError: undefined method `load_gems' for #<Geminabox app_file="/apps/geminabox/lib/geminabox.rb">
    from (irb):7
    from /usr/local/rvm/rubies/ruby-2.2.1/bin/irb:11:in `<main>'
2.2.1 :008 >
Run Code Online (Sandbox Code Playgroud)

我不明白为什么,我希望有人可以启发我.

Ale*_*kin 5

Sinatra::Base覆盖的本征类new.

您可能会检查Geminabox.new实际返回的实例Sinatra::Wrapper:

Class.new(Sinatra::Base).new.class
#? Sinatra::Wrapper
Run Code Online (Sandbox Code Playgroud)

要获得您想要的,请使用:

Geminabox.private_instance_methods false
Run Code Online (Sandbox Code Playgroud)