浅谈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写的顺序进行的。
这样做的一个好处就是写了一个块,但是可以被写在同样方法的不同参数调用,方便快捷。
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.
浅谈ruby中的block及yield的更多相关文章
- 视频基础知识:浅谈视频会议中H.264编码标准的技术发展
浅谈视频会议中H.264编码标准的技术发展 浅谈视频会议中H.264编码标准的技术发展 数字视频技术广泛应用于通信.计算机.广播电视等领域,带来了会议电视.可视电话及数字电视.媒体存储等一系列应用,促 ...
- 浅谈数据库系统中的cache(转)
http://www.cnblogs.com/benshan/archive/2013/05/26/3099719.html 浅谈数据库系统中的cache(转) Cache和Buffer是两个不同 ...
- 浅谈Java中的equals和==(转)
浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str ...
- 浅谈Linux中的信号处理机制(二)
首先谢谢 @小尧弟 这位朋友对我昨天夜里写的一篇<浅谈Linux中的信号处理机制(一)>的指正,之前的题目我用的“浅析”一词,给人一种要剖析内核的感觉.本人自知功力不够,尚且不能对着Lin ...
- 浅谈Java中的对象和引用
浅谈Java中的对象和对象引用 在Java中,有一组名词经常一起出现,它们就是“对象和对象引用”,很多朋友在初学Java的时候可能经常会混淆这2个概念,觉得它们是一回事,事实上则不然.今天我们就来一起 ...
- 浅谈Java中的equals和==
浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: String str1 = new String("hello"); String str2 = ...
- 转【】浅谈sql中的in与not in,exists与not exists的区别_
浅谈sql中的in与not in,exists与not exists的区别 1.in和exists in是把外表和内表作hash连接,而exists是对外表作loop循环,每次loop循环再对内表 ...
- 浅谈iOS中的userAgent
浅谈iOS中的userAgent User-Agent(用户代理)字符串是Web浏览器用于声明自身型号版本并随HTTP请求发送给Web服务器的字符串,在Web服务器上可以获取到该字符串. 在公司产 ...
- 浅谈JavaScript中的闭包
浅谈JavaScript中的闭包 在JavaScript中,闭包是指这样一个函数:它有权访问另一个函数作用域中的变量. 创建一个闭包的常用的方式:在一个函数内部创建另一个函数. 比如: functio ...
随机推荐
- Linux操作NFS挂载、卸载等操作
一.NFS服务器的设置 NFS服务器的设定可以通过/etc/exports这个文件进行,设定格式如下 分享目录 主机名或IP(参数1,参数2) /binbin 172.17.1.*(rw,sync,n ...
- [EffectiveC++]item42:了解typename的双重意义
- 只用最适合的! 全面对比主流 .NET 报表控件:水晶报表、FastReport、ActiveReports 和 Stimulsoft
前言 随着 .NET 平台的出现,报表相关的开发控件随之出现,目前已经有若干成熟的产品可供开发人员使用,本文旨在通过从不同维度对比目前最流行的4款 .NET报表控件,给所有报表开发人员在做产品选型时一 ...
- SOJ 1017 Power of Cryptography 库函数精度
Background Current work in cryptography involves (among other things) large prime numbers and comput ...
- [CQOI2006]凸多边形(半平面相交)
嘟嘟嘟 本来我要写feng shui这道题的.然后网上都说什么半平面相交,于是我还得现学这个东西,就来刷这道模板题了. 所谓的半平面相交和高中数学的分数规划特别像.比如这道题,把每一条边看成一条有向直 ...
- seek()和tell()在文件里转移
Seek()方法允许在输入和输出流移动到任意的位置,seek()有好几种形式.包含:seekp() 方法和seekg()方法,p是put的意思,g是get的意思:其中输入流里用seekg()函数,输出 ...
- spring boot容器加载完后执行特定操作
有时候我们需要在spring boot容器启动并加载完后,开一些线程或者一些程序来干某些事情.这时候我们需要配置ContextRefreshedEvent事件来实现我们要做的事情 1.Applicat ...
- 修改ubuntu计算机名
修改计算机名下: -$sudo gedit /etc/hostname -$sudo gedit /etc/hosts
- Delphi XE10在 Android下调用静态库a文件
Delphi Seatle can link Delphi project with Static library files(*.a): 1.at Delphi IDE, Add the " ...
- HTML小记
1.页面内跳转 当<a>元素用于页面内的锚点跳转时,应该先为该页面设置一些锚点,而定义锚点有两种办法: 通过<a>元素的name属性来定义,如:<a name=" ...