[ruby, python] - code block
От: DemAS http://demas.me
Дата: 13.03.09 10:32
Оценка:
Я тут решил познакомиться с Ruby и наткнулся code block's, которые
позволяют реализовать вот такие интересные вещи:

class File
   def File.open_and_process(*args)
     f = File.open(*args)
     yield f
     f.close()
   end
end

File.open_and_process("file", "r") do |file|
  while line = file.gets
   puts line
  end
end


То есть, мы, как создатели класса File можем гарантировать закрытие файла,
не полагаясь на память и внимательность пользователя этого класса.

Похожую вещь можно сделать и в Python с помощью ключевого слова with
(http://expl0rer.wordpress.com/2009/03/04/with_in_python/), но даже в этом
случае мы не застрахованы от того, что пользователь при работе с классом
забудет о использовании слова with.

Наверное, в Python можно попробовать использовать декораторы, но я сходу не
нашел возможности получить из декоратора параметр (файловый дескриптор, в
данном случае). Такая возможность есть или параметры передаются только в
декоратор?

Если бы данную задачу решать на обобщенном ООП языке, то наверное можно
было бы воспользоваться примерно такой конструкцией:

Реализовать базовый класс:

Base(object):
private file;

public work_with_file(file):
pass

public run():
file = openfile()
work_with_file(file)
close_file(file)

и заставить пользователя создавать для работы с файлами наследника от
моего, перекрывая метод work_with_file(file):

First(Base):
public work_with_file(file):
// do some work with file


Может есть какие-то более удобные паттерны и приемы, не привязанные к
конкретному языку программирования, достигать такой же цели — гарантировать
освобождение ресурсов?
Posted via RSDN NNTP Server 2.1 beta
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.