Ruby 事务Blocks

block可以用来定义必须运行在事务控制环境下的代码。例如,你经常需要打开一个文件,对其内容做些处理,然后确保在处理结束后关闭文件。尽管可以用传统方式来实现,但也存在“应该由文件负责自身的关闭”这样的观点。Ruby的File类支持这项技术。

       如果File.open有个关联的block,那么该block将被调用,且参数是该文件对象,当block执行结束时文件会被关闭。这意味着File.open有两种不同的行为:当和block一起调用时,它会执行该block并关闭文件;当单独调用时,它会返回文件对象。

       使得上述行为成为可能的是Kernel.block_given?方法,当某方法和block关联在一起调用时,Kernel.block_given?将返回true。下面是类似于标准File.open的方法(忽略了错误处理)。

classFile
  defFile.my_open(*args)
    result = file =File.new(*args)
    if block_given?# 判断是否带有block #
      result = yield file # 如果有block,再次调用 #
      file.close
    end
    return result
  end
end

File.open("testFile", "r"){|file| # {}中的操作在yield语句处被调用 #
# 关于file的操作
}

 

posted @ 2013-09-30 09:28  zhangsai  阅读(337)  评论(0编辑  收藏  举报