刚开始接触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入门的好教材。
分享到:
- 2007-02-18 00:51
- 浏览 4580
- 评论(7)
- 论坛回复 / 浏览 (7 / 8260)
- 查看更多
相关推荐
迭代器、代码块、闭包迭代器、代码块、闭包
day05 状态+观察者+备忘录+迭代器+中介者+访问者
2.内容:基于GMM的高斯混合模型的数据四分类的matlab仿真,输出分类结果和迭代曲线+代码操作视频 3.用处:用于高斯混合模型数据分类学习 4.指向人群:本硕博等教研学习使用 5.运行注意事项: 使用matlab2021a...
2.内容:基于EM算法的GMM高斯混合模型matlab仿真,输出聚类结果以及对数边际似然迭代过程+代码操作视频 3.用处:用于EM算法的GMM高斯混合模型算法编程学习 4.指向人群:本硕博等教研学习使用 5.运行注意事项: ...
迭代器模式的示例代码和文档,学习迭代器模式的参考资料。
实现节点和迭代器-代码,包含两部分代码实现节点与迭代器。
比较简单的迭代器代码,适合c++学习和了解
八数码迭代深搜+A* 有较强的深搜优化剪支
雅克比迭代+高斯迭代+SOR迭代法Matlab程序,同时支持谱半径计算,利于直接比较三种算法
设计模式之迭代器模式的java小程序实现!简单的代码!
* 基于列表实现的元素迭代器 */ package dsa; public class IteratorElement implements Iterator { private List list;//列表 private Position nextPosition;//当前(下一个)元素的位置 //默认构造方法 ...
C++ STL中迭代器介绍 迭代器 迭代器提供对一个容器中的对象的访问方法,并且定义了容器中对象的范围。迭代器就如同一个指针。事实上,C++的指针也是一种迭代器。但是,迭代器不仅仅是指针,因此你不能认为他们一定...
简单的php迭代器代码,容易理解,运用广泛
2.内容:分别通过梯度下降法,不动点迭代法,牛顿迭代法对方程进行求解+代码操作视频 3.用处:用于梯度下降法,不动点迭代法,牛顿迭代法编程学习 4.指向人群:本硕博等教研学习使用 5.运行注意事项: 使用matlab...
迭代计算源代码,自己写的,很简单,可以参考一下
设计模式-迭代器模式(讲解及其实现代码)
[C#基础知识系列]专题十二:迭代器源码
迭代器设计模式代码示例--以最简单的代码诠释迭代器设计模式
用java编写的迭代器,实现10数字正反向遍历。
迭代子模式 java中级进阶高级23种设计模式详细介绍+代码详解PPT模板全文共26页,当前为第18页。 责任链模式 java中级进阶高级23种设计模式详细介绍+代码详解PPT模板全文共26页,当前为第19页。 命令模式 java中级...