浅谈ruby中的block及yield

Posted fish-101

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅谈ruby中的block及yield相关的知识,希望对你有一定的参考价值。

今天写代码的时候遇到了block_given?,查阅了一下语法书中并没有相关的知识点,于是翻阅微博及结合工作中的实际代码,整理如下:

 

一、“块”:

ruby的块指的是什么?

是 do~end中间的那部分代码,这就是全部的块。它的形式有两种:

1、do ~ end中的多行代码(这种在多行代码时可读性更强)

2、当界面只有一行代码的时候,可以用{ }包裹

 

块通常不在方法中定义,而是通过作为一个参数传递给块。块可以传递给任何方法,前提是方法中有yield关键字块才回被调用并执行。

 

先贴一段调用块的代码:、

def 函数
  p 111
   yield 
  p 222
 end
 
 函数 {p 333}

 输出结果:

111
333
222

 可以看到,yield作为介质,将块传入进了函数方法里,然后继续往下执行 p 222

 

二、yield中也可以传递参数

可见如下代码,yield将参数传递进了块里面,注意参数传入顺序是按照yield写的顺序进行的。

这样做的一个好处就是写了一个块,但是可以被写在同样方法的不同参数调用,方便快捷。

1 def method
2   yield("Joey",12)
3 end
4 
5 method do|name,age| 
6   p "#{name} is a lovely boy,he is #{age} years old."
7 end

 输出结果:

"Joey is a lovely boy,he is 12 years old."

 

三、常见的block_given?到底怎么用呢?

先看这样一段代码,预测一下输出结果是什么样:

def 函数
  p 111
   yield
  p 222
 end
函数

 

 

输出结果:

111

报错信息: no block given (yield) (LocalJumpError)

可见,当写了yield,但是并没有块给它调用的时候,程序就会报错。

block_given?方法就巧妙地根据是否有块,判断是否传递给调用的方法,它是返回一个布尔值。将上面的代码修改一下:

def 函数
  p 111
  yield if block_given?
  p 55
end
 
函数

 

 

输出结果:

111

555

因为没有块,所以不传入块,继续进行下一步的操作 p 55.

 

以上是关于浅谈ruby中的block及yield的主要内容,如果未能解决你的问题,请参考以下文章

201706 Ruby 基础 & 元编程

有趣的Ruby-学习笔记4

JSP,能不能像Ruby/Rails/Erb中的yield, layout, content_for一样工作

ruby 我感兴趣的库中的代码片段

Python学习笔记之二浅谈Python的yield用法

ruby yield 关键字用法实例