黑松山资源网 Design By www.paidiu.com

我们来简单地描述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。

黑松山资源网 Design By www.paidiu.com
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
黑松山资源网 Design By www.paidiu.com

P70系列延期,华为新旗舰将在下月发布

3月20日消息,近期博主@数码闲聊站 透露,原定三月份发布的华为新旗舰P70系列延期发布,预计4月份上市。

而博主@定焦数码 爆料,华为的P70系列在定位上已经超过了Mate60,成为了重要的旗舰系列之一。它肩负着重返影像领域顶尖的使命。那么这次P70会带来哪些令人惊艳的创新呢?

根据目前爆料的消息来看,华为P70系列将推出三个版本,其中P70和P70 Pro采用了三角形的摄像头模组设计,而P70 Art则采用了与上一代P60 Art相似的不规则形状设计。这样的外观是否好看见仁见智,但辨识度绝对拉满。