Ruby 如何通过一个街区

Ruby 如何通过一个街区,ruby,yield,Ruby,Yield,为了简单起见,我试图将问题抽象为其核心元素。我已经包含了一小部分功能,其中我使用Socket来表示我希望将块进一步传递到一个方法中,该方法对于所有意图和目的来说都是一个黑匣子。我还传递了一个常量True,以显示我想要传递参数和一个yield块 综上所述,如果我有这样一个调用层次结构: def foo(使用本地源) 如果使用\u本地\u源 unix(“/var/run/my.sock”)&yield 其他的 tcp(“my.remote.com”,1234)和yield 结束 结束 foo(真){

为了简单起见,我试图将问题抽象为其核心元素。我已经包含了一小部分功能,其中我使用
Socket
来表示我希望将块进一步传递到一个方法中,该方法对于所有意图和目的来说都是一个黑匣子。我还传递了一个常量
True
,以显示我想要传递参数和一个yield块

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

def foo(使用本地源)
如果使用\u本地\u源
unix(“/var/run/my.sock”)&yield
其他的
tcp(“my.remote.com”,1234)和yield
结束
结束
foo(真){套接字|
name=socket.read
写上“嗨#{name},我来自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
收益率的文档中:

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


啊,太棒了!我确实读过收益率文档,我记得读过那句话,但坦率地说,没有这个例子,我不理解它的意思。说实话,我还是不知道。我是否将整个Socket.unix(“/var/run/my.sock”)
作为参数传递给yield?(我已经在代码中尝试过了,效果非常好)是的,您传递参数就像在任何其他方法中一样。奇怪的是,您将它们传递回最初调用它的块(“匿名函数”,如果有帮助的话)。请看并注意这两种方法之间的细微差别,但结果相同。好的,谢谢。我想我现在明白了。那个小要点把事情弄清楚了。大约一周前,我开始对ruby垂涎三尺,因此这澄清了ruby中的一个核心功能(what think)。谁对这个问题投了反对票,请告诉我为什么,以便我将来可以改进我的问题?什么是
真的
?在没有解释的情况下,不要放置太多的常量/方法。假设它是一个常量,不清楚为什么要使用这种构造。假设它是一种方法,那么根本不清楚代码在做什么。True只是一个象征性的参数,表明我有一个函数“foo”,它既接受参数又接受收益。@sawa我将接受大部分关于技术方面的评论,但我想建议你不要改变人们提问的情绪或写作风格。我更喜欢写和读一些非正式的(但清晰的)问题。如果我选择“完美”而不是“前礼时态”或“强调式复制”,我这样做是为了用我当时的思维过程来解释我的问题,而不是用我在问题回答后的思维过程来解释我的问题,而这正是其他正在寻找问题的人所拥有的。