【问题标题】:Code block from Ruby bookRuby 书中的代码块
【发布时间】:2015-01-25 05:30:43
【问题描述】:

我在 Coppers 的书“Beginning Ruby”中找到了这个代码块示例。这应该是处理代码块的自定义方法的示例?

  def each_vowel(&code_block)
    %w{a e i o u}.each { |vowel| code_block.call(vowel) }
  end

  each_vowel { |vowel| puts vowel }

我只是看不出这是如何工作的。他是在将一个代码块发送到另一个代码块吗?

只是感觉有些不对劲。我知道each 从数组中一次获取一个特定项目并将其放入vowel 变量中,但接下来会发生什么?

【问题讨论】:

    标签: ruby


    【解决方案1】:

    是的,你是对的,一个块正在另一个块内执行。 &code_block 是一种将块转换为可执行过程对象的特殊方法。在方法定义中,code_block 现在引用了一个 proc 对象,该对象在使用 call 方法执行时,实质上是运行与方法调用关联的块中的代码(在本例中为 { |vowel| puts vowel }

    这不是执行相关块的唯一方法。另一种非常常见的方法是使用 yield 关键字。在这里,只要达到 yield 关键字,就会执行该块。

    def each_vowel
      %w{a e i o u}.each { |vowel| yield(vowel) }
    end
    
    each_vowel { |vowel| puts vowel }
    

    注意,在这种情况下,没有必要在方法签名中使用&code_block。 Yield 始终可以访问关联的块。但是,如果您想以 proc 对象的形式访问块,则需要在参数列表的末尾指定类似 &code_block 的内容。

    【讨论】:

    • 所以在 { |元音| yield(vowel) } 我们将元音作为参数传递给代码块。所以它会放 a,e,i,o,u
    • 是的,完全正确。我们传递给 yield 的任何东西都将作为 { |vowel| puts vowel } 块的参数传递。由于yield(vowel) 被调用了五次(每个元音一次),{ |vowel puts vowel} 也被调用了五次,每次都将另一个字母传递给vowel 参数。在您的示例中,code_block.call(vowel) 的作用完全相同。
    • 没问题。你有一个有趣的例子。如果发布的答案之一满足您的问题,如果您能接受,那就太好了。
    • 抱歉,忘记了,我刚点了 :)
    【解决方案2】:

    %w{a e i o u} 是单词数组的ruby syntax。相当于['a', 'e', 'i', 'o', 'u']

    所以上面的代码可以写成:

      def each_vowel(&code_block)
        ['a', 'e', 'i', 'o', 'u'].each { |vowel| code_block.call(vowel) }
      end
    
      each_vowel { |vowel| puts vowel }
    

    因此,这段代码对数组中的每个元素 (.each) 所做的就是调用块 (code_block.call),并将元素作为参数。

    .each 本身接受一个块(在本例中为{ |vowel| code_block.call(vowel) })并为数组中的每个元素调用它。

    each_vowel { |vowel| puts vowel } 行调用前面定义的方法,将块 { |vowel| puts vowel } 作为输入参数。可能对括号更熟悉:

      each_vowel() { |vowel| puts vowel }
    

    但是在 ruby​​ 中括号是可选的,尤其是当方法不需要参数时(块不计为参数)。

    【讨论】:

    • 我明白了,但我看不到这部分发生了什么{ |元音| code_block.call(元音) }
    • @user3867776 - 我添加了更多解释。如果您发现仍有不清楚的地方,请指出我的问题所在。
    • each { |vowel| ... }forEach(function(vowel) { ... }) 的 JavaScript 非常相似。只需将其视为一个内联函数,其定义方式略有不同。
    • OP,假设你是code_block,昵称是“Cap”,因为你唯一知道的就是将字符串大写。人们呼出诸如“嘿,队长,我用'e'得到什么?”之类的话。你做你的事并大喊大叫,“那将是'E'”。在背景中,您会听到其他人喊道:“哟,Sizey,我能从‘神器’中得到什么?”,然后回答说:“八!”。
    猜你喜欢
    • 1970-01-01
    • 2013-11-12
    • 1970-01-01
    • 2014-06-26
    • 2015-08-04
    • 2012-09-27
    • 2015-06-10
    • 2021-02-14
    • 2016-04-05
    相关资源
    最近更新 更多