如何通过一个块

How to pass a block

为了简单起见,我尝试将问题抽象为核心要素。我已经包括了一小部分功能,其中我使用 Socket 来表明我想将块进一步向下传递到一个方法中,该方法是一个用于所有意图和目的的黑盒子。我还传递了一个常量 True 以表明我想传递参数以及 yield 块。

综上所述,如果我有这样的调用层次结构:

def foo(use_local_source)
  if use_local_source
    Socket.unix("/var/run/my.sock") &yield
  else
    Socket.tcp("my.remote.com",1234) &yield
  end
end

foo(True) { |socket|
  name = socket.read
  puts "Hi #{name}, I'm from foo."
}

如何将隐式声明的块向下传递到 foo 并进入 Socket,就好像我直接调用 Socket.tcp(...) { ... } 一样。

我知道我可以将它设置为参数,但它对 Ruby 来说并不惯用。这也是不真实的吗,我应该将其作为论据传递吗?我尝试了 &* 的组合,但出现了一系列异常。

def foo(use_local_source)
  if use_local_source
    yield Socket.unix("/var/run/my.sock")
  else
    yield Socket.tcp("my.remote.com",1234)
  end
end

来自 yield 的文档:

Yields control back to the context that resumed the fiber, passing along any arguments that were passed to it.