Ruby 向调用者块屈服的惯用方式是什么';打电话的人是谁?

Ruby 向调用者块屈服的惯用方式是什么';打电话的人是谁?,ruby,Ruby,如果一个人想屈服于呼叫者的呼叫者,该如何继续?我得出了以下结论: def method1(param) method2(param) { |x| yield x if block_given? } end def method2(param) yield(param) if block_given? # Can I yield from here end method1("String") { |x| puts x } # to here in a more elegant wa

如果一个人想屈服于呼叫者的呼叫者,该如何继续?我得出了以下结论:

def method1(param)
  method2(param) { |x| yield x if block_given? }
end

def method2(param)
  yield(param) if block_given?   # Can I yield from here
end

method1("String") { |x| puts x } # to here in a more elegant way?

只需显式地传递块

def method1(param, &block)
  method2(param, &block)
end

def method2(param)
  yield param if block_given?
end

method1("String") { |x| puts x } # >> String

只需显式地传递块

def method1(param, &block)
  method2(param, &block)
end

def method2(param)
  yield param if block_given?
end

method1("String") { |x| puts x } # >> String

一种方法是在第一种方法中不使用收益率:

def method1(param, &block)
  method2(param, &block)
end

def method2 param
  yield param if block_given?
end
一元符号AND表示方法参数列表中的“块槽”。当您传递一个块时,您可以通过将
&
放在最终参数名称的正前方来访问传递的块。它可以以同样的方式传递给其他方法


您可以在这里看到有关
&
的许多详细信息:

一种方法是在第一种方法中不使用收益率:

def method1(param, &block)
  method2(param, &block)
end

def method2 param
  yield param if block_given?
end
一元符号AND表示方法参数列表中的“块槽”。当您传递一个块时,您可以通过将
&
放在最终参数名称的正前方来访问传递的块。它可以以同样的方式传递给其他方法


你可以在这里看到很多关于
&
的细节:

我个人并不讨厌显式块,但阿法伊克正统说
方法2
应该放弃
&block
的论点,如果给出块,就做出
让步?
@tokland:同意。更新了帖子,为什么这更正统?如果它包含了一个动机,说明为什么这个特定的公式是好的,答案会更好。@N.N.我没有数字要显示,但是请检查经验丰富的Ruby程序员编写的代码,您会发现这是一种常见的做法。基本原理可能是这样的:1)
yield
block.call
更惯用(这就是为什么合成糖首先存在的原因)。2) 如果
block
没有这样使用,那么将其作为参数传递是没有意义的(所有Ruby方法都可以接受一个块,不管是否有块参数)。奇怪的是,他没有讨论这件事。我个人也不讨厌显式块,但AFAIK正统说
method2
应该放弃参数
&block
,如果给定块,则做出
让步?
@tokland:同意。更新了帖子,为什么这更正统?如果它包含了一个动机,说明为什么这个特定的公式是好的,答案会更好。@N.N.我没有数字要显示,但是请检查经验丰富的Ruby程序员编写的代码,您会发现这是一种常见的做法。基本原理可能是这样的:1)
yield
block.call
更惯用(这就是为什么合成糖首先存在的原因)。2) 如果
block
没有这样使用,那么将其作为参数传递是没有意义的(所有Ruby方法都可以接受一个块,不管是否有块参数)。奇怪的是,他没有讨论这件事。也检查