Программирование на языке Ruby
Программирование на языке Ruby читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
В следующем примере человек получает 5-процентный доход на начальный капитал с момента рождения. Мы не храним ни возраст, ни текущий баланс, поскольку они являются функциями времени.
class Person attr_reader :name attr_reader :age attr_reader :balance def initialize(name,birthdate,beginning) @name = name @birthdate = birthdate @beginning = beginning @age = (Time.now - @birthdate)/(365*86400) @balance = @beginning*(1.05**@age) end def marshal_dump Struct.new("Human",:name,:birthdate,:beginning) str = Struct::Human.new(@name, @birthdate, @beginning) str end def marshal_load(str) self.instance_eval do initialize(str.name, str.birthdate, str.beginning) end end # Прочие методы...endp1 = Person.new("Rudy",Time.now - (14 * 365 * 86400), 100)p [p1.name, p1.age, p1.balance] # ["Rudy", 14.0, 197.99315994394]str = Marshal.dump(p1)p2 = Marshal.load(str)p [p2.name, p2.age, p2.balance] # ["Rudy", 14.0, 197.99315994394]При сохранении объекта этого типа атрибуты
agebalancemarshal_loadinitializenew10.2.3. Ограниченное «глубокое копирование» в ходе маршалинга
В Ruby нет операции «глубокого копирования». Методы
dupcloneНиже предлагается способ реализовать глубокое копирование с некоторыми ограничениями, обусловленными тем, что наш подход основан на использовании класса
Marshaldef deep_copy(obj) Marshal.load(Marshal.dump(obj))enda = deep_copy(b)10.2.4. Обеспечение устойчивости объектов с помощью библиотеки PStore
Библиотека
PStorePStorerequire "pstore"# Сохранить.db = PStore.new("employee.dat") db.transaction do db["params"] = {"name" => "Fred", "age" => 32, "salary" => 48000 }end# Восстановить.require "pstore"db = Pstore.new("employee.dat")emp = nildb.transaction { emp = db["params"] }Обычно внутри блока транзакции используется переданный ему объект
PStoreЭта техника ориентирована на транзакции; в начале блока обрабатываемые данные читаются с диска. А в конце прозрачно для программиста записываются на диск.
Мы можем завершить транзакцию досрочно, вызвав метод
commitabortrequire "pstore"# Предполагается, что существует файл с двумя объектами.store = PStore.new("objects")store.transaction do |s| a = s["my_array"] h = s["my_hash"] # Опущен воображаемый код, манипулирующий объектами # a, h и т. д. # Предполагается, что переменная "condition" может # принимать значения 1, 2, 3... case condition when 1 puts "Отмена." s.abort # Изменения будут потеряны. when 2 puts "Фиксируем и выходим." s.commit # Изменения будут сохранены. when 3 # Ничего не делаем... end puts "Транзакция дошла до конца."
