Ruby中的block代码块学习教程_ruby专题

1、什么是代码块
在Ruby中,{}或do...end之间的代码是一个代码块。代码块只能出现在一个方法的后边,它紧接在方法最后一个参数的同一行上,由yield关键字调用。例如:

[1,2,3,4,5].each { |i| puts i }

[1,2,3,4,5].each do |i|
puts i
end

块变量:以yield关键字调用block也可以传递参数,block中竖线(|)之间给出的参数名用于接收来自yield的参数。

 竖线之间(如上例中的 | i |)的变量被称作块变量,作用和一个正常方法的参数一样

2、掌握代码块的编写
最常见、最简单、最富争议、最有Ruby风格的方式是blocks。写法如下:

array = [1, 2, 3, 4]

array.collect! do |n|
 n ** 2
end

puts array.inspect

# => [1, 4, 9, 16]

do…end构成一个block。然后把这个block通过collect!传给一个数组。就可以使用block中的n来迭代数组中每个元素。

collect!是Ruby库里的方法,下面我们来写一个自己的类似方法iterate!

class Array
 def iterate!
  self.each_with_index do |n, i|
   self[i] = yield(n)
  end
 end
end

array = [1, 2, 3, 4]

array.iterate! do |n|
 n ** 2
end

puts array.inspect

# => [1, 4, 9, 16]

首先,我们打开Array,并添加进iterate!方法。方法名以!结尾表示危险方法,引起注意。现在我们就可能像使用collect!一样使用iterate!

与属性不同,在方法中不需要指定block的名字,而是使用yield来调用。yield会执行block中的代码。同时,注意我们是怎么把n(each_with_index当前处理的数字)传给yield的。传给yield的参数即对应了block中的参数(||中的部分)。现在n就能被block调用并在yield调用中返回n**2。
整个调用如下:
1、一个整数组成的数组调用iterate!
2、当yield被调用时,把n(第一次为1,第二次为2,…)传给block
3、block对n进行n**2。因为是最后一行,自动作为结果返回。
4、yield得到block的结果,并把值重写到array里。
5、数据中每个对象执行相同操作。

3、{}和do...end优先级不同

在传递一个block时,使用{}传递的block比使用do…end的优先级要高;

为了避免引起歧义,最好使用()将参数括起来。例如:

1.upto 3 do |x|

puts x

end

是正确的,但是 1.upto 3 {|x| puts x} 编译不通过,应该写成   1.upto(3) {|x| puts x}

原因:

1.upto 3 do…end 中block会传递到upto方法里面,3会作为一个参数传递给upto

1.upto 3 {|x| puts x} 一句会把3当做函数名,将block传递到这个函数,其返回值作为upto方法的参数,所以编译不过,需加()。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索ruby
, block
, 代码块

,以便于您获取更多的相关知识。

时间: 2024-12-01 20:10:21

Ruby中的block代码块学习教程_ruby专题的相关文章

Ruby中的循环语句的用法教程_ruby专题

 Ruby中的循环用于执行相同的代码块指定的次数.本章将详细介绍Ruby支持的循环语句.Ruby while 语句:语法: while conditional [do]    code end 执行代码当条件为true时.while循环的条件是代码中的保留字,换行,反斜杠(\)或一个分号隔开. 实例: #!/usr/bin/ruby $i = 0 $num = 5 while $i < $num do puts("Inside the loop i = #$i" ) $i +=1

在Ruby中处理日期和时间的教程_ruby专题

Time 类在 Ruby 中用于表示日期和时间.它是基于操作系统提供的系统日期和时间之上.该类可能无法表示 1970 年之前或者 2038 年之后的日期. 本教程将让您熟悉日期和时间的所有重要的概念.创建当前的日期和时间 下面是获取当前的日期和时间的简单实例: #!/usr/bin/ruby -w time1 = Time.new puts "Current Time : " + time1.inspect # Time.now 是一个同义词 time2 = Time.now puts

详解Ruby中的代码块及其参数传递_ruby专题

一,块的声明   块的声明在函数调用之后,用{..}括起来,或do..end封装.{}一般用在单行语句上,do..end用在多行语句上. (1..4).each{|v| print "#{v} "} #输出1 2 3 4   块可以带参数,与函数参数不同,块参数用||封装,当然,可以带多个参数.这些参数怎么定义,实际上是在函数内部定义好的,后面会讲到. 二,块内变量的访问   块内可以访问块外的变量,也就是块外的变量在块内是可见的,如 sum = 0 (1..5).each do |v

全面解析Objective-C中的block代码块的使用_IOS

1.相关概念 在这篇笔记开始之前,我们需要对以下概念有所了解. 1.1 操作系统中的栈和堆 注:这里所说的堆和栈与数据结构中的堆和栈不是一回事. 我们先来看看一个由C/C++/OBJC编译的程序占用内存分布的结构: 栈区(stack):由系统自动分配,一般存放函数参数值.局部变量的值等.由编译器自动创建与释放.其操作方式类似于数据结构中的栈,即后进先出.先进后出的原则. 例如:在函数中申明一个局部变量int b;系统自动在栈中为b开辟空间. 堆区(heap):一般由程序员申请并指明大小,最终也由

Ruby的基础语法入门学习教程_ruby专题

让我们编写一个简单的 Ruby 程序.所有的 Ruby 文件扩展名都是 .rb.所以,把下面的源代码放在 test.rb 文件中. 实例 #!/usr/bin/ruby -w puts "Hello, Ruby!"; 在这里,假设您的 /usr/bin 目录下已经有可用的 Ruby 解释器.现在,尝试运行这个程序,如下所示: $ ruby test.rb 这将会产生下面的结果: Hello, Ruby! 您已经看到了一个简单的 Ruby 程序,现在让我们看看一些 Ruby 语法相关的基

Ruby中使用连续体Continuation实现生成器_ruby专题

ruby中有很多经典的驱动器结构,比如枚举器和生成器等.这次简单介绍下生成器的概念.生成器是按照功能要求,一次产生一个对象,或称之为生成一个对象的方法.ruby中的连续体正好可以用来完成生成器的功能.连续体说起来晦涩,其实还是很简单的,它有3个特点: 1. callcc方法会给代码块传一个连续体对象,你可以保存该对象; 2. 当调用连续体的call方法时指令流会跳转到callcc方法之后; 3. 如果给连续体的call方法传递对象,则callcc方法会返回该对象,如果不传递对象,callcc会返

详解Ruby中的单件方法和单件类_ruby专题

单件方法 Ruby允许给单个对象增加方法,这种只针对单个对象生效的方法,称为单件方法 示例代码 str = "just a regular string" def str.title? self.upcase == self end str.title? # => false str.methods.grep(/title?/) # => [:title?] str.singleton_methods #=> [:title?] str.class # => S

Ruby中检测Gem是否安装的方法_ruby专题

最近参加七牛的demo大赛,决定使用ruby开发.于是遇到了一些疑问,然后解决了,这里记录一下. 在Ruby中,Gem是一个很常见的东西,其相当于插件,Ruby有很多很棒的gem,避免了我们重复造轮子,我的demo中需要安装gem,但是为了更加实现好一些,先检测gem是否已经安装,如果没有安装,在继续安装,否则不安装. 于是,怎么在Ruby中检测gem是否安装呢,其实也很简单,直接上代码就可以了.不需太多解释.begin-rescue-相当于java中的try catch. 复制代码 代码如下:

Ruby中操作字符串的一些基本方法_ruby专题

 在Ruby中的String对象持有和操纵的任意序列的一个或多个字节,通常表示人类语言的字符表示. 简单的字符串文本括在单引号(单引号字符).引号内的文本的字符串值: 'This is a simple Ruby string literal' 如果需要内放置一个单引号,单引号的字符串文字,在它前面加上一个反斜杠Ruby解释器不认为终止字符串: 'Won\'t you read O\'Reilly\'s book?' 反斜杠也可以转义另一个反斜杠,这样第二个反斜杠本身不是解释为转义字符. 以下是