所以我有一个类似的记录:
/dbdata:/data mydb:latest
有没有办法让我在读取之后停止从Record中读取:name_len和:name,仅当:name等于某个值?或者,一旦你开始阅读带有记录的文件,它必须一直运行吗?
我知道我可以使用:只能跳过所有剩下的,但有没有办法把:onlyif放在后面的所有内容上?你能选择:onlyif吗?
我试过的代码:
class Property < BinData::Record
endian :little
int32 :name_len
string :name, read_length: :name_len
# want to quit here.
int32 :type_len
string :type, read_length: :type_len
end
我还尝试将所有内容放在:name_len和:name in it自己的Record中并执行此操作:
class Property < BinData::Record
endian :little
int32 :name_len
string :name, read_length: :name_len
int32 :type_len, :onlyif => :not_none?
string :type, read_length: :type_len, :onlyif => :not_none?
int64 :data_len, :onlyif => :not_none?
choice :data, :onlyif => :not_none?, selection: :type do
int32 "IntProperty\x00"
float "FloatProperty\x00"
struct "StrProperty\x00" do
int32 :len
string :data, read_length: :len
end
struct "NameProperty\x00" do
int32 :len
string :data, read_length: :len
end
struct "ArrayProperty\x00" do
int32 :num_items
array :properties, type: :property, initial_length: :num_items
end
end
def not_none?
name != 'None\x00'
end
end
但是这没有用,因为如果我把PropertyData Record放在这个以上(因为Property需要知道PropertyData是什么),那么它就会出错,因为PropertyData需要知道什么是Property(因为它填充了具有该类型的数组)。他们无法相互认识,因为他们互相使用。
答案 0 :(得分:0)
[T]他没有工作,因为如果我将PropertyData Record置于此之上(因为Property需要知道PropertyData是什么),那么它会出错,因为PropertyData需要知道属性是什么(因为它用这种类型填充数组。)
你可以通过在Property之前声明PropertyData类来解决这个问题,但是在之后填写它:
class PropertyData < BinData::Record; end # Forward declaration
class Property < BinData::Record
endian :little
# ...
end
class PropertyData < BinData::Record
endian :little
# ...
end
您可以在list.rb
example中看到同样的事情。