ruby系列教材(23):Blocks and Iterators

上一篇 / 下一篇  2008-02-02 15:25:08 / 个人分类:Ruby

在前面说过的SongList例子中,我们没有谈到with_title这个method的实现,这里要做一下描述:

 

很直观的一种做法就是,盲目搜索,对所有情况进行匹配:

class SongList

  def with_title(title)

    for i in0...@songs.length                   #0开始,直到小于@songs.length,范围是[0,@songs.length)

      return @songs[i] if title == @songs[i].name

    end

    return nil

  end

end

 

*在for中,用...(3点),求数组长度用length,判断字符串是不是相等用==,这里和java里面不同的是,==不是用来判断2个class id是不是相当,for循环使用end结束

 

我们可以很明显的感觉到上面的with_title使用的明显不是ruby的方式,不够简洁,ruby设计者已经考虑到了,array和iterator间的关系密切,所以为array设置了一个find这样的iterator(以前还介绍过Fixnum class里面的times iterator),下面是更加好的实现方式:

class SongList

  def with_title(title)

    @songs.find{|song| song.name == title}

  end

end

 

find这个iterator,return element,如果没有要查找的element,就return nil,yield带有一个parameter,表示array里面的elements。

不要从语法上学习ruby,这个是很重要的,因为ruby设计者希望ruby能够更加自然,更加接近人,所以,这里理解find,是这样:

find{|element| condition}   #element会从0到最后一个element,condition包含了判断这个element是否合理,假如conditon成立,返回element,否则继续,直到element被遍历完成,返回nil


TAG: Ruby

 

评分:0

我来说两句

我的栏目

日历

« 2024-04-22  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

  • 访问量: 22633
  • 日志数: 47
  • 建立时间: 2008-01-29
  • 更新时间: 2008-02-02

RSS订阅

Open Toolbar