Ruby代码块实现传递代码
创始人
2024-06-16 08:30:18
0

Ruby语言中有许多和其他语言不通的特性,值得我们在学习和实践中去深入的探讨。比如今天我们为大家介绍的Ruby代码块,就是一个功能强大的一系列代码应用。#t#

Ruby代码块可以和方法调用关联的一系列代码,就好像这些代码是方法的参数一样,这是一个令人难以置信的强大特性。你可以使用代码块实现回调(但不像Java的匿名内部类那么简单),传递一系列代码(但要比C的函数指针更加复杂),和实现迭代器。

Ruby代码块是用大括号或者do...end括起来的一系列代码。

  1. { puts "Hello" } 
    # 这是一个代码块  
  2. do #    
  3. club.enroll(person)  
  4.  # 这也是代码块    
  5. person.socialize #    
  6. end  

 

 

一旦你创建了一个代码块,就可以把它和一个方法调用关联在一起。那个方法能够调用代码块一次或者更多次,用Ruby的yield语句。下面的例子显示了这个过程。我们定义一个方法,这个方法调用yield两次。然后我们调用这个方法,把代码块放在同一行中方法调用的后面(也是方法的所有参数的后面)。[有些人喜欢把和方法关联的Ruby代码块当作是一种传递过来的参数。它们虽然是一个级别的,但这没有显示出所有的内涵。***把代码块和方法当成是协同工作的关系,在它们之间控制在来回交换。

  1. def callBlock  
  2. yield  
  3. yield  
  4. end  
  5. callBlock { puts "In the block" } 

 

结果:
In the block
In the block

看看Ruby代码块中的代码(puts "In the block") 是如何被执行两次的,就是对yield的每一次调用。

你可以在调用yield时给出参数,这些参数传递给代码块。在代码块中,列举变量的名字来接受参数,这些参数被用"|"括着。

 

  1. def callBlock  
  2. yield ,   
  3. end  
  4. callBlock { |, | ... }  

 

Ruby代码块贯穿在实现迭代器的Ruby库中,迭代器就是一种方法,用来连续返回某种集合的元素,比如一个数组。

  1. a = %w( ant bee cat dog elk )
     # 创建一个数组  
  2. a.each { |animal| puts animal }
     # 迭代所有的内容  
  3. produces:   
  4. ant  
  5. bee  
  6. cat  
  7. dog  
  8. elk 

 

我们来看看实现Array类的each迭代器的可能的方法,我们要用到前面的例子。each迭代器遍历数组的每个元素,每次都调用yield,类似的代码可能会是下面这样:

  1. # 在Array类中...  
  2. def each  
  3. for each element  
  4. yield(element)  
  5. end  
  6. end 

 

这样你就可以使用数组的each方法来迭代数组元素提供给代码块,Ruby代码块依次在每个元素返回时被调用一次。

 

  1. [ 'cat', 'dog', 'horse' ]
    .each do |animal|  
  2. print animal, " -- "  
  3. end  

 

结果:
cat -- dog -- horse --

类似的,内置在语言比如C或者Java中的许多循环结构在Ruby中就是简单的方法调用,这个方法调用所关联的代码块0次或者更多次。

  1. 5.times { print "*" }  
  2. 3.upto(6) {|i| print i }
     //puts是每打印一个就有回车的,print没有  
  3. ('a'..'e').each {|char| print char } 

 

结果:
*****3456abcde

在这里,我们让数字5调用一个代码块5次,然后让数字3调用一个Ruby代码块,传递给它连续的数值直到6,***,字符"a"到"e"的区间使用each方法调用一个块。

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...