【问题标题】:What is the idiomatic way to yield to the block of the caller's caller?屈服于调用者的调用者块的惯用方式是什么?
【发布时间】:2012-12-24 23:19:28
【问题描述】:

如果一个人想屈服于调用者的调用者的阻塞,应该如何进行?我想出了以下几点:

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?

【问题讨论】:

    标签: ruby


    【解决方案1】:

    一种方法是在第一种方法中不使用yield:

    def method1(param, &block)
      method2(param, &block)
    end
    
    def method2 param
      yield param if block_given?
    end
    

    一元 & 表示方法参数列表中的“块槽”。当您传递一个块时,您可以通过将& 放在最终参数名称之前来访问传递的块。它可以以相同的方式传递给其他方法。

    你可以在这里看到很多关于&的细节:http://ablogaboutcode.com/2012/01/04/the-ampersand-operator-in-ruby/

    【讨论】:

      【解决方案2】:

      明确地传递块

      def method1(param, &block)
        method2(param, &block)
      end
      
      def method2(param)
        yield param if block_given?
      end
      
      method1("String") { |x| puts x } # >> String
      

      【讨论】:

      • 就我个人而言,我并不讨厌显式块,但 AFAIK 正统观点认为 method2 应该放弃参数 &block 并创建一个 yield if block_given?
      • @tokland:同意。更新了帖子。
      • @tokland 为什么这样更正统?如果它包含为什么这个特定公式是好的动机,答案会更好。
      • @N.N.我没有要显示的数字,但是请由经验丰富的 Ruby 编码人员检查代码,您会发现这是一种常见的做法。基本原理可能是这样的:1)yieldblock.call 更惯用(这就是合成糖首先存在的原因)。 2) 如果 block 没有被这样使用,那么将它作为参数传递是没有意义的(所有 Ruby 方法都可以接受一个块,无论是否有一个块参数)。很惊讶github.com/bbatsov/ruby-style-guide 没有讨论这个问题。还要检查stackoverflow.com/questions/1410160/ruby-proccall-vs-yield
      猜你喜欢
      • 2012-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多