码迷,mamicode.com
首页 > 其他好文 > 详细

浅谈ruby中的block及yield

时间:2019-03-05 15:34:26      阅读:860      评论:0      收藏:0      [点我收藏+]

标签:font   整理   方法   微博   err   函数   方便   error   可见   

今天写代码的时候遇到了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

标签:font   整理   方法   微博   err   函数   方便   error   可见   

原文地址:https://www.cnblogs.com/fish-101/p/10476889.html

(0)
(1)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!