簡體   English   中英

從塊調用方法

[英]Call methods from blocks

我正在使用connection_pool來管理與redis的連接,此刻,我需要使用$redis.with {|conn| conn.set("key", 1)} $redis.with {|conn| conn.set("key", 1)}來設置密鑰。

我該怎么做

redis.set("key", 1)

並具有與上述代碼行相同的效果。

或至少

redis(set("key", 1))

根據文檔

您可以使用ConnectionPool::Wrapper來包裝單個全局連接,從而隨着時間的推移可以更輕松地移植連接代碼:

 $redis = ConnectionPool::Wrapper.new(size: 5, timeout: 3) { Redis.connect } $redis.sadd('foo', 1) $redis.smembers('foo') 

包裝器使用method_missing檢出連接,運行請求的方法,然后立即將連接檢回到池中。 它不是高性能的,因此您希望盡快移植對性能敏感的代碼以供使用。

但是我懷疑這只是一個解決方法,您現在的工作方式似乎就是庫設計的工作方式。

盡管我沒有理由按照您的要求進行操作,但我們還是可以:

class << redis
  def my_set key, value
    $redis.with { |conn| conn.set key, value }
  end
end

接着:

redis.my_set 'key', 1

對於所有感興趣的方法:

class << redis
  %i(set get foo bar).each do |m|
    class_eval <<-CEEOF
      def my_#{m} *args
        $redis.with { |conn| conn.#{m} *args }
      end
    CEEOF
  end
end

方法列表可以從conn.instance_methods(false)自動產生。

Ruby方法中接收塊的兩種主要方法:

首先是使用yield關鍵字,如下所示:

def speak
  puts yield
end

speak { "Hello" }
# Hello
#  => nil

另一種方法是在方法簽名中的最后一個參數前面加上“&”號,然后將根據傳入的任何塊創建Proc對象。

然后可以使用call方法執行該對象,如下所示:

def speak(&block)
  puts block.call
end

speak { "Hello" }
# Hello
#  => nil

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM