我需要访问从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 >
我不明白为什么,我希望有人可以启发我。
答案 0 :(得分:5)
Sinatra::Base
的本征类会覆盖new
。
您可以检查Geminabox.new
是否实际返回Sinatra::Wrapper
的实例:
Class.new(Sinatra::Base).new.class
#⇒ Sinatra::Wrapper
要获得所需内容,请使用:
Geminabox.private_instance_methods false