如果有多个采用以下形式的BinData记录,下面是几个示例:
class DebugInfo < BinData::Record
endian :little
int32 :num
array :data, :type => :debug_log, initial_length: :num
end
class GoalInfo < BinData::Record
endian :little
int32 :num
array :data, :type => :goal, initial_length: :num
end
class PackageInfo < BinData::Record
endian :little
int32 :num
array :data, :type => :package, initial_length: :num
end所有这些在本质上都是相同的,它们只是使用不同类型的对象组成了一个数组。有没有办法只做其中一个,然后以某种方式将它传递给我希望它读入数组的对象类型?
发布于 2016-06-11 11:47:31
module Info
@base_classes = {}
def self.[](type)
@base_classes[type] ||= Class.new(BinData::Record) {
endian :little
int32 :num
array :data, :type => type, initial_length: :num
}
end
end然后
class DebugInfo < Info[:debug_log]
end
class GoalInfo < Info[:goal]
end
class PackageInfo < Info[:package]
end免责声明
未测试。
发布于 2016-06-11 12:02:08
BinData::Base.read将除第一个参数( IO对象)之外的所有参数直接传递给#initialize,所以我认为这样做是可行的:
class InfoRecord < BinData::Record
endian :little
int32 :num
array :data, type: :array_type, initial_length: :num
attr_reader :array_type
def initialize(*args)
@array_type = args.pop
super
end
end
InfoRecord.read(io, :debug_log)然而,这与数字用户线(info_record :my_record, ...)并不能很好地配合。
为了弥补这一点,我认为你可以这样做:
class InfoRecord < BinData::Record
# ...
array :data, type: :array_type, initial_length: :num
def array_type
@params[:array_type]
end
end
InfoRecord.read(io, array_type: :debug_log)我对上面的内容不太确定,因为BinData::Base#initialize处理散列参数的方式有点复杂,但希望它能让你做到以下几点:
class MyRecord < BinData::Record
info_record :my_info, array_type: :debug_log
endhttps://stackoverflow.com/questions/37759447
复制相似问题