由于工作关系,一直没有时间学习ruby,最近终于有时间可以学习下ruby了,同时也在csdn开了blog,借此记录一下自己学习的心得,当然不仅仅是ruby,近几年动态语言非常的火热,而我个人也非常喜欢动态语言的简洁,可惜一直都没什么时间花在上面,如果可能除了ruby,我也想花花时间在其他的语言上,例如Groovy,不过暂时还是以ruby为主,其他的有时间再看了。
对于ruby来说,我完全是个新手,所以目前所写的文章都绝对是基础性的,主要作为一个笔记的作用,所以各位高手可不要BS在下。不过还好,总是有一点点底子,学起来不至于那么痛苦。昨天搞了本《The Ruby way》来看,本来想买《Programming Ruby》,可是后来看到Way这本书觉得它更适合我,对于一般的语法介绍随便上网看看就可以了,而Way一书主要是从解决各种问题着手,实用性较强,我们学语言就是为了解决问题嘛,可不是为了显摆,经过艰难的抉择最终选择了Way这本书(最主要是way一书便宜些,呵呵),有的朋友说这些书可以从网络上获得,为什么还要买?我只能说这是我的习惯,更喜欢实体书,特别是好书自己一定要有一本实体书收藏。(汗一个,只是为了收藏。)
买了书回来后,迫不及待的翻开看了下,其中第一章有一段粗略的讲了下迭代器的实现,大概看了下,实现非常简单,其代码如下:
repeat方法接受一个condition参数,首先运行代码块,然后如果condition为false的时候retry进行重新运行代码块。非常简单且简洁的实现,这里包含了两个重要的关键字,一个是yield,另外一个就是retry,yield的作用就是执行方法所接受的代码块,这是动态语言中非常重要的概念,如果对这个概念不了解,那么ruby就很难学下去了,在Groovy里面也有同样的功能,使用 Closure闭包实现的。而retry的作用就是重新运行代码块,当然是在not condition成立的时候。
书里同时也实现了一个可传递参数的迭代器实现,代码如下(为什么csdn插入代码功能里提供的语言种类没有ruby,郁闷):
以上代码实现了一个迭代器生成1~10的整数,然后调用这个迭代器生成前10个整数的立方。方法接受一个带参数的代码块 {|x| puts x**3 } ,然后进行循环运行该代码块,yield之后的i就是传给代码块的参数。
对于以上第一个实现,我对其进行了一点点修改,具体如下:
说实话,这个实现我也是按照自己的理解修改,感觉这样更适合,自己试了下没什么问题,结果也如我所料,可是感觉这样的写法不太好,只能在慢慢的学习去体会了。
对于ruby来说,我完全是个新手,所以目前所写的文章都绝对是基础性的,主要作为一个笔记的作用,所以各位高手可不要BS在下。不过还好,总是有一点点底子,学起来不至于那么痛苦。昨天搞了本《The Ruby way》来看,本来想买《Programming Ruby》,可是后来看到Way这本书觉得它更适合我,对于一般的语法介绍随便上网看看就可以了,而Way一书主要是从解决各种问题着手,实用性较强,我们学语言就是为了解决问题嘛,可不是为了显摆,经过艰难的抉择最终选择了Way这本书(最主要是way一书便宜些,呵呵),有的朋友说这些书可以从网络上获得,为什么还要买?我只能说这是我的习惯,更喜欢实体书,特别是好书自己一定要有一本实体书收藏。(汗一个,只是为了收藏。)
买了书回来后,迫不及待的翻开看了下,其中第一章有一段粗略的讲了下迭代器的实现,大概看了下,实现非常简单,其代码如下:
def repeat(condition)
yield
retry if not condition
end
yield
retry if not condition
end
repeat方法接受一个condition参数,首先运行代码块,然后如果condition为false的时候retry进行重新运行代码块。非常简单且简洁的实现,这里包含了两个重要的关键字,一个是yield,另外一个就是retry,yield的作用就是执行方法所接受的代码块,这是动态语言中非常重要的概念,如果对这个概念不了解,那么ruby就很难学下去了,在Groovy里面也有同样的功能,使用 Closure闭包实现的。而retry的作用就是重新运行代码块,当然是在not condition成立的时候。
书里同时也实现了一个可传递参数的迭代器实现,代码如下(为什么csdn插入代码功能里提供的语言种类没有ruby,郁闷):
def my_sequence
for i in 1..10 do
yield i
end
end
my_sequence {|x| puts x**3 }
for i in 1..10 do
yield i
end
end
my_sequence {|x| puts x**3 }
以上代码实现了一个迭代器生成1~10的整数,然后调用这个迭代器生成前10个整数的立方。方法接受一个带参数的代码块 {|x| puts x**3 } ,然后进行循环运行该代码块,yield之后的i就是传给代码块的参数。
对于以上第一个实现,我对其进行了一点点修改,具体如下:
def repeat(condition)
if not condition
yield
retry
end
end
if not condition
yield
retry
end
end
说实话,这个实现我也是按照自己的理解修改,感觉这样更适合,自己试了下没什么问题,结果也如我所料,可是感觉这样的写法不太好,只能在慢慢的学习去体会了。