Подтвердить что ты не робот

File.open с блоком vs без

У меня вопрос о блоке, эти два кода означают то же самое?

код 1

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

код 2

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

Ответ 1

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

В общем, каждый метод может работать (работает) по-разному с блоком или без блока. Он должен всегда указываться в документации по методу.

Ответ 2

Нет, они не означают то же самое. В первом примере файл автоматически закрывается после обработки блока. Во втором примере ваша ответственность - вручную вызвать newFile.close.