今天写代码的时候遇到了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的更多相关文章

  1. 视频基础知识:浅谈视频会议中H.264编码标准的技术发展

    浅谈视频会议中H.264编码标准的技术发展 浅谈视频会议中H.264编码标准的技术发展 数字视频技术广泛应用于通信.计算机.广播电视等领域,带来了会议电视.可视电话及数字电视.媒体存储等一系列应用,促 ...

  2. 浅谈数据库系统中的cache(转)

    http://www.cnblogs.com/benshan/archive/2013/05/26/3099719.html 浅谈数据库系统中的cache(转)   Cache和Buffer是两个不同 ...

  3. 浅谈Java中的equals和==(转)

    浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str ...

  4. 浅谈Linux中的信号处理机制(二)

    首先谢谢 @小尧弟 这位朋友对我昨天夜里写的一篇<浅谈Linux中的信号处理机制(一)>的指正,之前的题目我用的“浅析”一词,给人一种要剖析内核的感觉.本人自知功力不够,尚且不能对着Lin ...

  5. 浅谈Java中的对象和引用

    浅谈Java中的对象和对象引用 在Java中,有一组名词经常一起出现,它们就是“对象和对象引用”,很多朋友在初学Java的时候可能经常会混淆这2个概念,觉得它们是一回事,事实上则不然.今天我们就来一起 ...

  6. 浅谈Java中的equals和==

    浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: String str1 = new String("hello"); String str2 = ...

  7. 转【】浅谈sql中的in与not in,exists与not exists的区别_

    浅谈sql中的in与not in,exists与not exists的区别   1.in和exists in是把外表和内表作hash连接,而exists是对外表作loop循环,每次loop循环再对内表 ...

  8. 浅谈iOS中的userAgent

    浅谈iOS中的userAgent   User-Agent(用户代理)字符串是Web浏览器用于声明自身型号版本并随HTTP请求发送给Web服务器的字符串,在Web服务器上可以获取到该字符串. 在公司产 ...

  9. 浅谈JavaScript中的闭包

    浅谈JavaScript中的闭包 在JavaScript中,闭包是指这样一个函数:它有权访问另一个函数作用域中的变量. 创建一个闭包的常用的方式:在一个函数内部创建另一个函数. 比如: functio ...

随机推荐

  1. .htaccess详解及.htaccess参数说明

    .htaccess文件(或者”分布式配置文件”)提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录.作为用户,所能使用的命令受到 ...

  2. Python入门学习网址

    Python入门学习网址:http://www.runoob.com/python/python-install.html

  3. 主存储器与CPU的连接

    半导体存储器的读写时间一般在十几至几百毫微秒之间,其芯片集成度高,体积小,片内含有译码器和寄存器等电路.常用的半导体存储器芯片有多字一位片和多字多位片,如16M位容量的芯片可以有16M×1位和4M×4 ...

  4. 数据链路层 点对点协议 PPP

    点对点协议 PPP 一. PPP 协议应满足的需求 简单.提供不可靠的数据报服务,比IP协议简单,不需要纠错,不需要序号,不需要流量控制. 工作方式:接收方每收到一个帧就进行CRC校验,如正确就接受该 ...

  5. composer随笔

    composer dump-autoload 生成autoload.php文件

  6. linux下的线程学习(二)

    #include <iostream> #include <pthread.h> void cleanup(void *arg) { printf("cleanup: ...

  7. java 包(package)

    package packageDemo2_5; public class packageDemo1 { String name;//同一个包里的类可以直接访问 //不同包里的类是不可以使用默认修饰符的 ...

  8. #npm install# MSBUILD : error MSB4132: 无法识别工具版本“2.0”。可用的工具版本为 "4.0"。

    0.问题描述 Windows 10 最近使用npm install安装项目依赖包,当自动执行至node-gyp rebuild时报错: C:\Users\dsl\Desktop\Pros\ant-de ...

  9. BZOJ3174:[TJOI2013]拯救小矮人(DP)

    Description 一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯.即:一个小矮人站在另一小矮人的 肩膀上,知道最顶端的小矮人伸直胳膊可以碰到陷阱口.对于每一个小矮人, ...

  10. TP框架---Model模型层---做模型对象

    TP框架----Model模型层---------------做模型对象 Model模型层是用来做什么的呢???? 主要是用来做操作数据库访问的. 也就说明TP框架自带了一种访问数据库的方式,使用的是 ...