Ruby blocks提供灵活编码手段
创始人
2024-06-16 14:21:03
0

Ruby语言的出现,改变了程序员传统的编写诶代码方式,使编程人员在编写代码时会有一种非常愉悦的心情。在这里我们为大家介绍一种灵活编码手段Ruby blocks。#t#

先来看一下这段代码:

  1. class SongList  
  2. def [](key)  
  3. return @songs[key] if 
    key.kind_of?(Integer)  
  4. return @songs.find { 
    |aSong| aSong.name == key }  
  5. end  
  6. end 

在第四行中,有find这样一个方法,可以按照指定条件对songs进行遍历,最终返回一个符合条件的个体。

下面就来看看这个方法到底是怎么实现的。

  1. class Array   
  2. def find   
  3. for i in 0size   
  4. value = self[i]   
  5. return value if yield(value)   
  6. end   
  7. return nil   
  8. end   
  9. end  

发现是在Array这个类中,增加了一个method,在method中嵌入了一个遍历操作。如果只是这样的话,那么ruby和其他语言也就没有什么差别了,我们注意到第5行中有yield,这么一个东东。其实他起到了一个代理的作用,实现了实际操作部分和遍历的分离。

再看看下面这个例子,来了解一下yield的功能。

  1. 1def threeTimes  
  2. yield  
  3. yield  
  4. yield  
  5. end  
  6. threeTimes { puts "Hello" } 

这里定义了名叫threeTimes的blocks, Ruby blocks中会重复3次外部的操作,当row 6的代码执行后,会得到后面的结果:
Hello
Hello
Hello

可以看到blocks为我们提供了如此灵活的手段,其实他语言中需要通过代理或接口或函数指针来实现。
其实.net 3.x以后的版本也提供了类似的功能,一个叫LINQ(Language Integrated Query )的东东。
可以使用类似SQL的方式过滤集合

 

  1. LINQ Query:  
  2. string[] names = { "Geoff", 
    "Jessica", "Mike", "Megan",  
  3. "Priscilla", "Jack", "Alma" };  
  4. IEnumerable expr = 
    from s in names  
  5. where s.Length == 5  
  6. orderby s  
  7. select s.ToUpper();  
  8. foreach (string item in expr)  
  9. Console.WriteLine(item); 

 

上面的用法是不是很简洁方便?用ruby来实现的话,将会是这样:

  1. names = [ "Geoff", "Jessica", 
    "Mike", "Megan", "Priscilla",  
  2. "Jack", "Alma" ]   
  3. expr = names.select {  
  4. |n| n.length == 5  
  5. }.sort.collect { |n| n.upcase }  
  6. expr.each {|n| puts n } 

正因为Ruby blocks如此方便,在阅读ruby程序的时候,可以看到被广泛的使用着。

相关内容

热门资讯

如何允许远程连接到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安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...