У меня есть двумерный массив, содержащий множество экземпляров класса. Класс содержит 4 массива. Я хотел бы сохранить и загрузить 2D-массив на/с диска с помощью Marshal. Я успешно использовал Marshal для этой цели с другими 2D-массивами, содержащими классы, но эти классы не содержали массива. Вот определение класса, доставляющего мне неприятности.
class Light
attr_accessor :R,:G,:B,:A
def initialize(i)
@R = Array.new(4, i)
@G = Array.new(4, i)
@B = Array.new(4, i)
@A = Array.new(4, i)
end
@R
@G
@B
@A
end
Я попытался определить свои собственные функции маршала в классе Light:
def marshal_dump
{'R' => @R,'G' => @G,'B' => @B,'A' => @A}
end
def marshal_load(data)
self.R = data['R']
self.G = data['G']
self.B = data['B']
self.A = data['A']
end
Вот создание 2D-массива, содержащего этот класс
def createLightMap(width,height)
a = Array.new(width) { Light.new(0.7) }
a.map! { Array.new(height) { Light.new(0.7) } }
return a
end
@lightMap = createLightMap(10,10)
Вот как я сохраняю и загружаю
#save
File.open('lightData','w') do |file|
Marshal.dump(@lightMap, file)
end
#load
@lightMap = if File.exists?('lightData')
File.open('lightData','w') do |file|
Marshal.load(file)
end
else
puts 'no light data found'
end
При загрузке я получаю сообщение об ошибке «в« загрузке »: ошибка формата дампа (несвязанный, индекс: -96) (ошибка аргумента)»
Я пробовал с пользовательскими функциями маршала дампа/загрузки и без них. Я использую jruby 1.5.1, рубин 1.8.7
@Rи т. д. в объявлении класса? - person Dave Newton   schedule 12.04.2012defобъявляет функцию ctor.@Xбудет просто оцениваться в контексте класса, а не экземпляра, и будетnil, потому что они ничем не инициализированы и совершенно бессмысленны на уровне класса (поскольку они являются экземплярами). переменные). - person Dave Newton   schedule 12.04.2012