Подкласс класса Ruby из Sinatra :: Base имеет закрытые методы, но они исчезают в консоли irb - PullRequest
0 голосов
/ 04 июня 2018

Мне нужно получить доступ к некоторым функциям в некоторых закрытых методах в классе Ruby, который подклассифицирован из Sinatra :: Base.

Определение класса начинается следующим образом:

class Geminabox < Sinatra::Base

начинаетсяс рядом блоков кода, таких как:

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

, где «load_gems» и «index_gems» являются частными методами, определенными позже в том же классе.

Однако, если я загружаю этот класс в консоль irb и создаю экземпляр, подобный этому:

 g=Geminabox.new

, а затем пытаюсь просмотреть закрытые методы, я получаю это:

> 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 >

Я не понимаю, почемуи я надеюсь, что кто-то может просветить меня.

1 Ответ

0 голосов
/ 04 июня 2018

Собственный класс Sinatra::Base переопределяет new.

Вы можете проверить, что Geminabox.new действительно возвращает экземпляр Sinatra::Wrapper:

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

Чтобы получить то, что вы хотите, используйте:

Geminabox.private_instance_methods false
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...