【问题标题】:How to pass more one code block to a function in Ruby?如何将多个代码块传递给 Ruby 中的函数?
【发布时间】:2009-11-25 14:06:13
【问题描述】:

我不知道任何 Ruby,现在正在阅读一些关于它的文档。 在阅读了关于使用代码块和“yield”关键字之后,我有一个疑问是是否可以将多个代码块传递给一个函数,并在被调用的函数中随意使用两者。

【问题讨论】:

    标签: ruby


    【解决方案1】:

    您一次只能传递一个块,但块实际上是 Proc 实例,您可以传递任意数量的实例作为参数。

    def mymethod(proc1, proc2, &block)
      proc1.call
      yield if block_given?
      proc2.call
    end
    
    mymethod(Proc.new {}, Proc.new {}) do
      # ...
    end
    

    但是,它很少有意义。

    【讨论】:

    • 块并不完全是 procs。它们有共同的用例和语法,但它们有足够的实现差异导致令人困惑的行为。这有点迂腐,但范围界定的差异之前让我感到厌烦。
    • @fengb 我刚刚做了一个测试。 gist.github.com/242746 你有更多关于 Proc 和 block 区别的文档吗? Ruby 告诉我一个块是一个 Proc。
    • 块通过使用 &var 语法被隐式地“类型转换”为 proc。但是,当用作块与 proc 时,某些操作的行为会有所不同。啰嗦但全面的比较:innig.net/software/ruby/closures-in-ruby.rb
    • 谢谢。这是一篇很长的文章,我将把它分成小块。 :)
    【解决方案2】:

    从语法上讲,使用yield 语句仅支持一个传递给函数的代码块。

    当然,您可以传递一个函数多个其他函数或“代码块对象”(Proc 对象)并使用它们,但不能简单地使用 yield

    【讨论】:

      【解决方案3】:

      您可以创建Proc 对象并传递任意数量的对象。

      我建议阅读 this page 以了解 Ruby 具有的所有不同的类似块和类似闭包的构造的微妙之处。

      【讨论】:

        【解决方案4】:

        您可以使用call 方法而不是yield 来处理传入的两个单独的块。

        方法如下:

        def mood(state, happy, sad )
          if (state== :happy)
            happy.call
          else
            sad.call
          end
        end
        
        mood(:happy, Proc.new {puts 'yay!'} , Proc.new {puts 'boo!'})
        mood(:sad, Proc.new {puts 'yay!'} , Proc.new {puts 'boo!'})
        

        你可以传递参数,例如:

        happy.call('very much')
        

        参数的工作方式与您在块中所期望的一样:

        Proc.new {|amount| puts "yay #{amount} !"}
        

        【讨论】:

          猜你喜欢
          • 2011-01-28
          • 1970-01-01
          • 2017-04-18
          • 2012-03-15
          • 2019-02-20
          • 1970-01-01
          • 2012-07-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多