如何传递一个块

时间:2015-02-07 17:11:27

标签: ruby yield

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

说了这么多,如果我小的话,那么就有这样的调用层次结构:

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那样具有惯用性。这也是不真实的,我应该把它作为一个论点?我尝试过&*的组合,我得到了一系列例外。

1 个答案:

答案 0 :(得分:1)

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的文档:

  

将控制权返回到恢复光纤的上下文, 传递传递给它的任何参数