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

时间:2018-06-04 09:42:48

标签: ruby sinatra

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

类定义的开头如下:

class Geminabox < Sinatra::Base

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

  get '/' do
    @gems = load_gems
    @index_gems = index_gems(@gems)
    erb :index
  end

其中&#39; load_gems&#39;和&#39; index_gems&#39;是稍后在同一个类中定义的私有方法。

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

 g=Geminabox.new

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

> 2.2.1 :005 > g.private_methods(false)  
=> [:initialize] 
> 2.2.1 :006 >

没有&#39; load_gems&#39;,没有&#39; index_gems&#39;等等。我无法使用&#39; send&#39;来呼叫他们中的任何一个。 :

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 >

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

1 个答案:

答案 0 :(得分:5)

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

您可以检查Geminabox.new是否实际返回Sinatra::Wrapper的实例:

Class.new(Sinatra::Base).new.class
#⇒ Sinatra::Wrapper

要获得所需内容,请使用:

Geminabox.private_instance_methods false