Ruby 中的 yeild 关键字 ( 上 )

yufei       6 年, 3 月 前       2831

这篇文章,我们就来聊聊 Ruby 中的 yeild 关键字,同时也会介绍 ( block ) ,yield 参数,返回值以及 Enumerable#map 方法的实现。

yield 关键词,通常都与块 ( block ) 有着密切的关系,允许在方法调用期间传递一组附加指令。

yield 的这种机制,允许我们根据实际需要自定义方法

什么是块 ( block ) ?

块 ( block ) 是 Ruby 方法语法的一部分。

这意味着当 Ruby 解析器识别出一个块时,它将与调用的方法相关联,并逐字地替换方法中的 yield

def one_yield
  yield
end
def multiple_yields
  yield
  yield
end
$> one_yield { puts "one yield" }
one yield
 => nil
$> multiple_yields { puts "multiple yields" }
multiple yields
multiple yields
 => nil

从上面的代码中可以看到,块内的代码会在字面上替换方法定义中的 yield 关键字

假如,如果我们在方法调用期间没有为包含 yield 的方法传递块,会发生什么 ?

block_given?

在方法中调用 yield 时,该方法需要一个块。否则,将抛出 LocalJumpError 异常

def yield_without_block
  yield
end
$> yield_without_block
LocalJumpError (no block given (yield))

因此,一个超实际的问题来了,我们要如何让块变得可选 ( option ) 呢 ?

答案就是使用 Kernel#block_given? 方法

def optional_block
  yield if block_given?
end
$> optional_block
 => nil
$> optional_block { puts 'optional block' }
optional block
 => nil

参数

可以给 yield 关键字传递一些块需要的参数。使用方式就像下面这样

def yield_with_arguments
  hello = 'Hello'
  world = 'World!'
  yield(hello, world)
end
$> yield_with_arguments { |hello, world| puts "#{hello} #{world}" }
Hello World!
 => nil

上面的代码中,块接收的参数为 | hello,world | ,是由 yield_with_arguments 方法内的 yield 提供的

返回值

只需将 yield 的返回值赋给变量,就可以获得块的返回值

def yield_with_return_value
  hello_world = yield
  puts hello_world
end
$> yield_with_return_value { "Hello World!" }
Hello World!
 => nil

hello_world 变量的值为 Hello World! ,这是块返回的值

结束语

关于 Ruby yield 关键字,还有一些其它的内容,但,我们下一章节再介绍吧

目前尚无回复
简单教程 = 简单教程,简单编程
简单教程 是一个关于技术和学习的地方
现在注册
已注册用户请 登入
关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.