个列表依次匹配每一首歌曲的标题即可.
class SongList def [](key) if key.kind_of?(Integer) return @songs[key] else for i in 0...@songs.length return @songs[i] if key == @songs[i].name end end return nil end end
它能工作,并且看上去也很熟悉,一个 for 循环遍历整个数组,能不能做的更自然些呢?
事实上有更自然的方法.这里我们的 for 循环要求数组的一些私有信息,它要求数组的长度,然后按序匹配每
一个值.为什
么不要求数组仅提供一个对其每个元素的检测呢?这正是 Array 的 find 方法所做的.
class SongList def [](key) if key.kind_of?(Integer) result = @songs[key] else result = @songs.find { |aSong| key == aSong.name } end return result end end
我们还可以把 if 用作语句修饰符来缩短句子.
class SongList def [](key) return @songs[key] if key.kind_of?(Integer) return @songs.find { |aSong| aSong.name == key } end end
find 方法是一个迭代器,一个重复调用代码块的方法.迭代器和代码块是 Ruby 最有趣的特性中的两个,所以 我们花些时间来研究一下它们(这个过程中我们也可以看到我们的[]方法是如何真正工作的).
实现迭代器 实现迭代器
一个 Ruby 迭代器不过是一个简单的方法,它可以调用代码块.初看 Ruby 的代码块很像是 C,Java 或者 Perl 中的代码块,不幸的是,不是这样----Ruby 的代码块是一种组合语句的途径但不是一种方便的途径.
首先,一个代码块出现在一个方法调用的代码附近,代码块和方法的最后一个参数处在同一行;第二,代码块 中的代码并不被执行,而是 Ruby 保存代码块出现时的上下文关系(局部变量,当前对象等等),然后进入到方 法中.这正是魅力所在.
在方法中,代码块通过 yield 语句被调用,这使得代码块就好像是一个方法一样.当 yield 执行时,它调用代码 块中的代码.代码块退出时,控制就马上被返回给 yield 后面的语句.[程序设计语言的粉丝会很高兴看到
上一篇:
ruby文本框的定位和内容的输入_Ruby代码
下一篇:
赛门铁克保险行业容灾系统的升级