Yield

让我们看看还有更多在使用中的块。4blocks.rb 程序引入了一些新东西 - 即一种执行传递给方法的匿名块的方式。这是使用关键字 yield 完成的。在第一个示例中,我定义了这个简单的方法:

4blocks.rb
  1. def aMethod
  2. yield
  3. end

它实际上没有任何自己的代码。相反,它期望接收一个块并且 yield 关键字会让块执行。这是我传递一个块的方式:

  1. aMethod{ puts( "Good morning" ) }

请注意,这次块不作为命名参数传递。尝试在圆括号之间传递块是错误的,如下所示:

  1. aMethod( { puts( "Good morning" ) } ) # This won't work!

相反,我们只是将块放在我们传递它的方法右侧旁边,就像我们在本章的第一个示例中所做的那样。该方法接收没有声明命名参数的块,并用 yield 调用块。

这是一个稍微有用的示例:

  1. def caps( anarg )
  2. yield( anarg )
  3. end
  4. caps( "a lowercase string" ){ |x| x.capitalize! ; puts( x ) }

这里 caps 方法接收一个参数 anarg,并将此参数传递给匿名块,然后由 yield 执行。当我调用 caps 方法时,我使用通常的参数传递语法传递一个字符串参数(”a lowercase string”)。匿名块在参数列表之后传递。当 caps 方法用字符串参数调用 yield(anarg) 时,”a lowercase string” 会被传递给该块,它被分配给块变量 x,它将其首字母大写并用 puts(s) 显示它。