我有一个关于Block的问题,这两个代码是否相同?
代码1
File::open('yozloy.txt','w') do |f|
f << 'Some contains'
end
代码2
newFile = File::open('yozloy.txt','w')
newFile << 'Some contains'
答案 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
通常,每个方法对于块或没有块可以以不同方式工作(工作)。它应该始终在方法文档中说明。