File.open с блоком против без - PullRequest
       1

File.open с блоком против без

26 голосов
/ 19 ноября 2010

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

код 1

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

код 2

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

Ответы [ 2 ]

34 голосов
/ 19 ноября 2010

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

26 голосов
/ 19 ноября 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...