File.open with block vs without

时间:2010-11-19 11:39:01

标签: ruby

我有一个关于Block的问题,这两个代码是否相同?

代码1

File::open('yozloy.txt','w') do |f|
  f << 'Some contains'
end

代码2

newFile = File::open('yozloy.txt','w')
newFile << 'Some contains'

2 个答案:

答案 0 :(得分:34)

不,他们的意思并不相同。在第一个示例中,文件在处理块后自动关闭。在第二个示例中,您有责任手动调用newFile.close

答案 1 :(得分:26)

DarkDust已经说过这些方法不同了。我会再解释一下这些块,因为我想我可以猜到你为什么问这个问题; - )

ruby​​中的块只是某种方法的参数。这不仅仅是一种不同的语法。

接受(可选)块的方法通常具有测试是否已使用块调用或不调用块的条件。

考虑这个非常简单的示例:(真正的File.open类似,但它确保文件关闭,即使您的块引发错误,例如)

def open(fname)
  self.do_open(fname)
  if block_given?
    yield(self) # This will 'run' the block with given parameter
    self.close
  else
    return self # This will just return some value
  end
end

通常,每个方法对于块或没有块可以以不同方式工作(工作)。它应该始终在方法文档中说明。