我需要在一个从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)
我不明白为什么,我希望有人可以启发我.
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)