论坛首页 编程语言技术论坛

Ruby中的迭代器实现。

浏览 1592 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-10-09  
记得刚接触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
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics