迭代器+代码块,让代码更简短
刚开始接触ruby,作为一个以JAVA开发为主的程序员,ruby的代码风格多少让我有点不太适应,也许习惯了复杂的风格,再简单起来就比较困难了吧, 看来没有其他语言牵绊的话,学起ruby应该更快。
今天看了下ruby中的迭代器和代码块,这两个概念在其他语言当中也有,但是ruby中的迭代器和代码块却给我焕然一新的感觉,也让我更加了解到ruby代码简短的一个原因,正所谓实践出真知,就让我举个简单的例子吧:
一个包含一个存储字符串的数组的类,写一个[]方法,方法传递一个key参数,如果参数为整数则直接用索引返回字符串,如果不是整数则判断数组中是否存在该值,存在则返回该字符串,否则返回nil。以下只写[]方法的实现
按照一般的写法
def [](key)
if key.kind_of?(Integer)
return @arr[key]
else
for i in 0...@arr.length
return @arr[i] if key == @arr[i]
end
end
return nil
end
这种写法我想大多数刚刚接触ruby的朋友都应该很熟悉,在其他语言中一般也是类似的写法,现在我们使用代码块+迭代器对这段代码改写一下
def [](key)
if key.kind_of?(Integer)
result = @arr[key]
else
result = @arr.find{|str| key == str}
end
return result
end
是不是简短了很多呢?主要就是@arr.find{|str| key == str} 这一句代码,find方法是Array的一个迭代器,而后面大括号中的内容就是一段代码块,这样就实现了和最上面那段代码一样的功能,且代码也简短了不少,让我们一起来看看find方法的大概实现吧
def find
for i in 0...size
value = self[i]
return value if yield(value) #此处调用代码块中的代码
end
return nil
end
value if yield(value) 这一句的yield就是调用代码块中的代码,后面括号的内容就是代码块的参数, 看到这里,相信不少刚刚接触的ruby的朋友都可能会觉得满意了,不,其实这段代码还能更简单,请看
def [](key)
return @arr[key] if key.kind_of?(Integer)
return @arr.find { |str| str == key }
end
哇,是不是又让人吃了一惊呢?居然仅仅两行代码就OK了,是否很惊奇呢?我也一样很惊奇,在没接触ruby之前,就到处听人说ruby的神奇之处,写ruby代码是一种享受,开始却是很怀疑,等到自己真正接触之后,才发现写ruby程序真的是一种享受,也许一开始无法一下能把代码写到最简单,而且也很难习惯ruby的风格,不过没有关系,只要有心,就一定能写得好,习惯是慢慢养成的。本文参考了Programming Ruby中的例子,有条件的朋友可以去买本来看看,这本书却是是ruby入门的好教材。
评论
对SICP下了订单,听说这本书有点难度,以后有不明白的地方请gigix多多指点。
实际上用Java编程你就会这样做。关键在于用Java的时候即便你想采用函数式的列表操作,动用匿名函数写出来的代码量一点都不比直接写循环来得少,可读性反而更低(ajoo以前有个帖子讲这事),其结果是习惯了Java的程序员可能压根就不想用列表操作。
对SICP下了订单,听说这本书有点难度,以后有不明白的地方请gigix多多指点。
- 浏览: 116761 次
- 性别:

- 来自: 珠海

- 详细资料
搜索本博客
我的相册
共 9 张
最新评论
-
使用java实现http多线程下 ...
...版式有问题, 希望能耐心的看看,谢谢了哈
-- by 落花虽有意 -
使用java实现http多线程下 ...
看了你的思路我也写了个简单的,中间出了点问题想请教您,谢谢了``` 问题是这样 ...
-- by 落花虽有意 -
Python笔记之and or陷阱
Python 2.5中可以用 value1 if expression else ...
-- by victorsos -
使用java实现http多线程下 ...
不错,谢谢,学习一下!
-- by nighty -
记张学友演唱会让我愤怒的 ...
保安的行为有抢劫的嫌疑
-- by JavaInActoin






评论排行榜