这篇文章,我们就来聊聊 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 关键字,还有一些其它的内容,但,我们下一章节再介绍吧
目前尚无回复