如何通过一个块
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.
为了简单起见,我尝试将问题抽象为核心要素。我已经包括了一小部分功能,其中我使用 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.