今天写代码的时候遇到了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写的顺序进行的。

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

 def method
yield("Joey",12)
end method do|name,age|
p "#{name} is a lovely boy,he is #{age} years old."
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.

最新文章

  1. win10打开IL DASM步骤:
  2. Eclipse下.project和.classpath作用(转)
  3. retrofit2中ssl的Trust anchor for certification path not found问题
  4. JAVA设计模式之访问者模式
  5. 【LeetCode】198 - House Robber
  6. [转]VPN服务器配置详解
  7. 最近的两个小项目,2:Python webapp的docker镜像
  8. C# 二叉查找树实现
  9. 杭州网赛 two rabbits (hdu 4745)
  10. Asp.Net集群中Session共享
  11. 关于AngularJS学习整理---浅谈$scope(作用域) 新手必备!
  12. TCP/IP、Http、Socket的区别与关系
  13. 软件 利用 win+R 快速启动(无需添加环境变量)
  14. python-web自动化-Js-日历操作
  15. 汲取营养的blog专栏
  16. hdu1716排列2(stl:next_permutation+优先队列)
  17. js精确计算(js浮点数精度问题)
  18. Zabbix监控PostgreSQL
  19. python mysql开发日志
  20. 基于redis分布式锁实现“秒杀”(转载)

热门文章

  1. 关于CATransform3D矩阵变换的简单解析
  2. VS无法加载Web项目
  3. PHPWAMP自启异常,服务器重启后Apache等服务不会自动重启的原因分析
  4. OC内存管理-黄金法则
  5. Angular Reactive Forms -- Model-Driven Forms响应式表单
  6. Java(Android)编程思想笔记03:在Android开发中使用MVP模式
  7. Java List详解,面试中应该如何解答关于List的问题
  8. RedisClient的安装及基本使用
  9. apache2 重启、停止、优雅重启、优雅停止
  10. BZOJ1049:[HAOI2006]数字序列(DP)