File.open with block vs without

mko*_*mko 26 ruby

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

代码1

File::open('yozloy.txt','w') do |f|
  f << 'Some contains'
end
Run Code Online (Sandbox Code Playgroud)

代码2

newFile = File::open('yozloy.txt','w')
newFile << 'Some contains'
Run Code Online (Sandbox Code Playgroud)

Dar*_*ust 34

不,他们的意思不一样.在第一个示例中,文件在处理块后自动关闭.在第二个示例中,您有责任手动呼叫newFile.close.


Ars*_*en7 27

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
Run Code Online (Sandbox Code Playgroud)

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