欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Ruby中的迭代器实现。

程序员文章站 2022-05-03 18:05:48
...
记得刚接触ruby的时候被可爱的each深深吸引,也有让人看不懂的

show("Ruby") |value| do puts "value is " + value end

深入了解以后终于发现了其中的秘密,今天有空整理出来。

其实这些都是ruby中的“块”所实现的。
块可以看成是由代码组合成的变量(是不是有点像函数?),我们可以在调用方法的传递一个块做参数,而方法内调用这个块就实现了上边的两种应用。

定义块可以使用

{
....
}

或者

do
....
end


然后在方法中使用yield调用就可以啦。

来个小例子,先来看看定义的方法

def show
yield
end

够简单吧,只有已经yield,有了他我们就可以传递一个块做参数给show方法,show方法就是调用执行我们传递的块。

show do
puts "我们定义的块"
end

运行来看看。没有意外屏幕就应该显示 "我们定义的块"
如果看不明白可以这样看看

show (do puts "我们定义的块" end)
#就是个参数,不过参数是个使用块语法定义的块。不过要注意可不能这么写,不能执行的~呵呵!真的想写一行就去掉括号吧。
show do puts "我们定义的块" end

基本的块的应用就是这么简单,来点深的,加上点参数。
还是来看看方法

def show name
yield name
end

多了一个参数而已,没难度。下面传递块。

show "SuperXieLei" do |value|
puts "我的名字是:" + value
end

太简单了。还可以传递多个参数。不写了,和其他的方法差不多。参数不足的时候就是nil,参数多了就是数组。

灵活的使用块可以很方便的让我们编写代码。下边这个是由一本书上改编而来的,书名就不说了避免广告嫌疑。

class Apple
def initialize name,color,weight,&action
@name = name
@color = color
@weight = weight
@action = action
end

def show
@action ? ( @action.call :name,@name) : (yield :name,@name)
@action ? ( @action.call :color,@color) : (yield :color,@color)
@action ? ( @action.call :weight,@weight) : (yield :weight,@weight)
end
end

apple = Apple.new "红苹果","红色","0.4" do |name,value|
puts "使用原始块执行--" + name.to_s + "变量值是:" + value.to_s
end
apple.show do |name,value|
puts "使用新定义块执行--" + name.to_s + "变量值是:" + value.to_s
end

apple1 = Apple.new "绿苹果","绿色","0.8"
apple1.show do |name,value|
puts "使用新定义块执行--" + name.to_s + "变量值是:" + value.to_s
end
相关标签: Ruby Apple