Я создал класс, который хочу привязать к файловому дескриптору, и закрою его, когда экземпляр GC-ed.Как вы проверите, будет ли вызываться деструктор Ruby?
Я создал класс, который выглядит примерно так:
class DataWriter
def initialize(file)
# open file
@file = File.open(file, 'wb')
# create destructor
ObjectSpace.define_finalizer(self, self.class.finalize(@file))
end
# write
def write(line)
@file.puts(line)
@file.flush
end
# close file descriptor, note, important that it is a class method
def self.finalize(file)
proc { file.close; p "file closed"; p file.inspect}
end
end
Затем я попытался проверить метод деструктора, как так:
RSpec.describe DataWriter do
context 'it should call its destructor' do
it 'calls the destructor' do
data_writer = DataWriter.new('/tmp/example.txt')
expect(DataWriter).to receive(:finalize)
data_writer = nil
GC.start
end
end
end
При выполнении этого теста, даже если «файл закрыт »печатается вместе с файлом. Проверьте, что тест не выполнен со следующим выходом:
1) DataWriter it should call its destructor calls the destructor
Failure/Error: expect(DataWriter).to receive(:finalize)
(DataWriter (class)).finalize(*(any args))
expected: 1 time with any arguments
received: 0 times with any arguments
# ./spec/utils/data_writer_spec.rb:23:in `block (3 levels) in <top (required)>'
Upvote, потому что вы узнали о сборе мусора и его завершении в рубине: D –
@ GavinMiller Я только что узнал об этом, только что вернулся к рубину после набега на землю C++, поэтому я, естественно, начал искать деструктора и научился что они немного необычны в рубине. –