Създадох обект, който не успя да се маршалира поради „дефиниция на единичен метаклас, изпълнена по време на изпълнение“ (правилно ли е това описание на това, което прави кодът?).
Това се извършва от следния код:
# define class X that my use singleton class metaprogramming features
# through call of method :break_marshalling!
class X
def break_marshalling!
meta_class = class << self
self
end
meta_class.send(:define_method, :method_y) do
return
end
end
end
# prepare my instance of X now
instance_of_x = X.new
# marshalling fine here
Marshal.dump instance_of_x
# break marshalling with metprogramming features
instance_of_x.break_marshalling!
Marshal.dump instance_of_x
# fails with TypeError: singleton can't be dumped
Какво мога да направя, за да накарам обекта да се маршалира правилно? Възможно ли е да се „премахнат“ компонентите сингълтън от class X
на обект instance_of_x
?
Наистина се нуждая от съвет за това, тъй като някои от нашите обекти трябваше да бъдат кеширани чрез механизъм за сериализация Marshal.dump. Този код се изпълнява в ruby-1.9.3, но очаквам да се държи подобно в ruby-2.0 или ruby-2.1
singleton_class
. И не се нуждаем от този хак за изпращане сdefine_singleton_method
наоколо. - person Max   schedule 20.05.2014remove_singleton_class_information!
може би? ;) - person criess   schedule 21.05.2014