Я знаю, что по замыслу вы не можете контролировать, что происходит, когда объект разрушается. Мне также известно определение некоторого метода класса в качестве финализатора.
Однако является ли идиома ruby для CII RAII (ресурсы инициализируются в конструкторе, закрываются в деструкторе)? Как люди управляют ресурсами, используемыми внутри объектов, даже когда случаются ошибки или исключения?
Использование обеспечивает работает:
f = File.open("testfile")
begin
# .. process
rescue
# .. handle error
ensure
f.close unless f.nil?
end
но пользователи класса должны помнить, что каждый раз, когда требуется вызвать метод open, нужно выполнять chacha , обеспечивающую начало-спасение-гарантию.
Так, например, у меня будет следующий класс:
class SomeResource
def initialize(connection_string)
@resource_handle = ...some mojo here...
end
def do_something()
begin
@resource_handle.do_that()
...
rescue
...
ensure
end
def close
@resource_handle.close
end
end
Параметр resource_handle не будет закрыт, если исключение вызвано каким-либо другим классом и скрипт завершится.
Или проблема в том, что я все еще делаю это тоже на C ++ - как?