为了简单起见,我试图将问题抽象为其核心要素。我已经包含了一小部分功能,其中我使用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那样具有惯用性。这也是不真实的,我应该把它作为一个论点?我尝试过&
和*
的组合,我得到了一系列例外。
答案 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
的文档:
将控制权返回到恢复光纤的上下文, 传递传递给它的任何参数 。