从块调用方法

时间:2015-06-19 12:02:58

标签: ruby-on-rails ruby

我正在使用connection_pool来管理我与redis的连接,目前我需要使用$redis.with {|conn| conn.set("key", 1)}来设置密钥。

我该怎么做

redis.set("key", 1)

并具有与上述相同的效果。

或者至少

redis(set("key", 1))

3 个答案:

答案 0 :(得分:1)

根据to the documentation

  

您可以使用ConnectionPool::Wrapper打包单个全局连接,从而可以更轻松地随时间移植连接代码:

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

包装器使用method_missing检出连接,运行请求的方法,然后立即检查连接回池。它不是高性能,因此您需要尽快移植性能敏感代码。

但我怀疑这只是一种解决方法,你现在正在采用的方式似乎是图书馆的工作方式。

答案 1 :(得分:1)

虽然我认为没有理由做你所问的,但我们走了:

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)中获得。

答案 2 :(得分:1)

在Ruby中接收方法中的块的两种主要方法:

首先使用yield关键字,如:

def speak
  puts yield
end

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

另一种方法是在方法签名中的最后一个参数前加一个&符号,然后从传入的任何块中创建一个Proc对象。

然后可以使用如下调用方法执行此对象:

def speak(&block)
  puts block.call
end

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