我知道这是设计使然,您无法控制对象被销毁时会发生什么。我也知道将一些类方法定义为终结器。
但是,C++ 的 RAII 的 ruby 习语是(资源在构造函数中初始化,在析构函数中关闭)吗?即使发生错误或异常,人们如何管理对象内部使用的资源?
使用确保工作:
f = File.open("testfile")
begin
# .. process
rescue
# .. handle error
ensure
f.close unless f.nil?
end
但是该类的用户必须记住每次需要调用 open 方法时 都要执行整个 begin-rescue-ensure 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++?