浅谈ruby中的block及yield
今天写代码的时候遇到了block_given?,查阅了一下语法书中并没有相关的知识点,于是翻阅微博及结合工作中的实际代码,整理如下:
一、“块”:
ruby的块指的是什么?
是 do~end中间的那部分代码,这就是全部的块。它的形式有两种:
1、do ~ end中的多行代码(这种在多行代码时可读性更强)
2、当界面只有一行代码的时候,可以用{ ~}包裹
块通常不在方法中定义,而是通过作为一个参数传递给块。
块可以传递给任何方法,前提是方法中有yield
关键字块才回被调用并执行,所以yield是定义带块的方法时最重要的关键字,调用方法时通过块传进来的处理会在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.