gpt4 book ai didi

从 Sinatra::Base 子类化的 Ruby 类具有私有(private)方法,但它们在 irb 控制台中消失了

转载 作者:数据小太阳 更新时间:2023-10-29 08:29:50 24 4
gpt4 key购买 nike

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

类定义是这样开始的:

class Geminabox < Sinatra::Base

它以这样的一系列代码块开始:

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

其中 'load_gems' 和 'index_gems' 是稍后在同一类中定义的私有(private)方法。

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

 g=Geminabox.new

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

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

没有 '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 >

我不明白为什么,希望有人能赐教。

最佳答案

Sinatra::Base 的特征类覆盖了 new .

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

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

要得到你想要的,使用:

Geminabox.private_instance_methods false

关于从 Sinatra::Base 子类化的 Ruby 类具有私有(private)方法,但它们在 irb 控制台中消失了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50677639/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com