我们来简单地描述Ruby的一个独特特性。Block,一种可以和方法调用相关联的代码块,几乎就像参数一样。这是一个不可思议的功能强大的特性。
可以用Block实现回调(但它比Java的匿名内部(anonymous inner)类更简单),传递一组代码(但它远比c的函数指针灵活),以及实现迭代器。
Block只是在花括号或者do...end之间的一组代码。
{puts "Hello"} #this is a block do ### club.enroll(person) #and so is this person.socialize # end ###
为什么有两种分界符?部分原因是有人觉得有时候用一种分界符比另外一种感觉更自然。另外一部分原因是它们有不同的优先级:花括号比do/end绑定的更紧密些。我们尝试遵循正在成为Ruby标准的一个约定俗成,单行block用花括号,多行block用do/end。
一旦创建了block,就可以与方法的调用相关联。把block的开始放在含有方法调用的源码行的结尾处,就可以实现关联。比如,在下面的代码中,含有puts "Hi" 的block与greet方法的调用相关联。
greet {puts "Hi"}
如果方法有参数,它们出现在block之前。
verbose_greet("Dave","loyal customer"){puts "Hi"}
然后使用Ruby的yield语句,方法可以一次或多次地调用(invoke)相关联的block。可以把yield想象成比如方法调用,它调用含有yield语句的方法所关联的block。
下面的例子显示了如何使用yield语句。定义了一个方法,它会调用yield两次。然后调用这个方法,把block放在同一行,在方法调用之后(并在方法的所有参数之后)。
def call_block puts "Start of method" yield yield puts "End of method" end call_block{puts "In the block"}
输出结果:
Strat of method In the block In the block End of method
可以提供参数给yield的调用;参数会传递到block中。在block中,竖线(|)之间给出参数名来接受这些来自yield的参数。
def call_block yield("Hello",99) end call_block {|str,num| ...}
在Ruby库中大量使用了block来实现迭代器;迭代器是从某种收集(collection)如数组中连续返回元素的方法。
animals = %w(ant bee cat dog elk) #创建一个数组 animals.each{|animal| puts animal} #迭代它的内容
输出结果:
ant bee cat dog elk
让我们看一下如何实现应用在前面例子中的Array类中的each迭代器。each迭代器循环处理数组中的元素,对每个元素调用yield。在伪码中,它可能写成:
#在Array类中...... def each for each element #<--无效的Ruby语句 yield(element) end end
许多内建于c和java等语言的循环结构在Ruby中只是方法调用,这些方法会零次或多次地调用相关联的block。
['cat','dog','horse'].each{|name| print name," "} 5.times {print "*"} 3.upto(6){|i| print i} ('a'..'e').each{|char| print char}
输出结果:
cat dog horse *****3456abcde
上面的代码要求对象5 五次调用block;然后要求对象3调用一个block,并传入一个连续的值,直到这个值到达6为止。最后对a到e的字符区间(range),使用each方法调用block。
主要内容:Ruby each 迭代器,语法,实例,Ruby collect 迭代器,语法,实例,实例简单来说:迭代(iterate)指的是重复做相同的事,所以迭代器(iterator)就是用来重复多次相同的事。 迭代器是集合支持的方法。存储一组数据成员的对象称为集合。在 Ruby 中,数组(Array)和哈希(Hash)可以称之为集合。 迭代器返回集合的所有元素,一个接着一个。在这里我们将讨论两种迭代器,each 和 collect。 Ruby each 迭代器 each 迭代器返回数组或哈希的
迭代意味着像循环一样多次执行一次事情,它一个接一个返回数组或哈希里面的元素,本章中会为大家介绍 Ruby 都有哪些迭代器。 1. each Ruby 的每个迭代器都从哈希和数组中返回每个元素,最常见的是 each 迭代器。 下面是一个数组的例子。 实例: [1, 2, 3, 4, 5].each do |number| puts number end # ---- 输出结果 ---- 1 2
本文向大家介绍Ruby中的block代码块学习教程,包括了Ruby中的block代码块学习教程的使用技巧和注意事项,需要的朋友参考一下 1、什么是代码块 在Ruby中,{}或do...end之间的代码是一个代码块。代码块只能出现在一个方法的后边,它紧接在方法最后一个参数的同一行上,由yield关键字调用。例如: 块变量:以yield关键字调用block也可以传递参数,block中竖线(|)之间给出
本文向大家介绍深入理解Ruby中的代码块block特性,包括了深入理解Ruby中的代码块block特性的使用技巧和注意事项,需要的朋友参考一下 block是什么? 在Ruby中,block并不罕见。官方对block的定义是“一段被包裹着的代码”。当然,我觉得这样的解释不会让你变的更明白。 对block的一种更简单的描述是“一个block就是一段存储在一个变量中的代码,它和其他的对象一样,可以被随时
本文向大家介绍Ruby中使用Block、Proc、lambda实现闭包,包括了Ruby中使用Block、Proc、lambda实现闭包的使用技巧和注意事项,需要的朋友参考一下 闭包(Closure),是指未绑定到任何对象的自由代码,闭包中的代码与任何对象和全局变量无关,只与执行此段代码的上下文相关。 今天我们简要的看一下ruby中的闭包实现。 Ruby中的闭包实现有:Block,Proc,Lamb
问题内容: 我正在尝试使用迭代器遍历我的日志列表中的列表。目标是搜索包含与新日志相同的电话号码,类型和日期的日志 但是,我在条件语句中得到了java.util.NoSuchElementException。有谁知道可能导致问题的原因? 我的密码 问题答案: 您在一次迭代中调用了很多次,迫使移至一个不存在的元素。 代替 用 每次调用时,它都会向前移动基础光标。