2013-11-21 1 views
1

В гем я работаю, я нашел фрагмент кода:Что означает «с (& block)» в Ruby?

@object.with(&block)

Но метод with(&block) не определен в проекте. Похоже, он определен как базовый метод внутри Ruby somwhere, но я не уверен.

Что это значит? Может ли кто-нибудь указать, где этот метод определен (например, в Object или Class или каком-либо другом классе Ruby)?

Edit:

Код в вопросе:

def self.redis(&block) 
    raise ArgumentError, "requires a block" if !block 
    @redis ||= Sidekiq::RedisConnection.create(@hash || {}) 
    @redis.with(&block) 
    end 

Это от проекта Sidekiq (https://github.com/mperham/sidekiq). Этот проект также включает жемчужину redis-rb (https://github.com/redis/redis-rb). Я не могу найти метод with, определенный в любом из них.

Возможно, я просто что-то упустил.

+2

возможный дубликат [Что это и блок в Ruby? И как он передается в методе здесь?] (Http://stackoverflow.com/questions/814739/whats-this-block-in-ruby-and-how-does-it-get-passed-in-a -method-here) – fotanus

+0

Я понимаю, что такое '& block' - это метод' .with', о котором я спрашиваю. –

+0

Я рассмотрел связанный вопрос, и он совсем не адресует определение метода '.with'. –

ответ

6

Он определен как часть connection_pool gem, который используется sidekiq, и его источник находится ниже. Похоже, что цель состоит в том, чтобы получить соединение из пула, привести его к предоставленному блоку, а затем отпустить соединение обратно в пул.

вот как я обнаружил, что из:

pry> redis = Sidekiq::RedisConnection.create({}) 
pry> redis.method(:with).source 

    def with 
    conn = checkout 
    begin 
     yield conn 
    ensure 
     checkin 
    end 
    end 

pry> redis.method(:with).source_location 

["./ruby/gems/2.0.0/gems/connection_pool-1.1.0/lib/connection_pool.rb", 46] 

и определить зависимость:

~$ bundle exec gem dependency connection_pool --reverse-dependencies 

Gem connection_pool-1.1.0 
    minitest (>= 5.0.0, development) 
    Used by 
    sidekiq-2.16.0 (connection_pool (>= 1.0.0)) 
+0

Ну, хорошая работа, найти это, Шерлок! – Nobita

+1

Вы, сэр, волшебник. Мне жаль, что я не смогу дважды выправить вас. –

+0

+1 Я добавил, что второе upvote;) –