我有一个有很多字段的类型。
Julia中的构造函数系统在我处理小类型时很好,但是你可以想象当我处理大对象时它会变得多么笨拙:
type Bar
a:Int32
b:Int32
c:Int32
d:Int32
e:Float32
f:Uint8
g:Int64
h:ASCIIString
# ...
end
bar = Bar(1, 2, 3, 4, 5, 1.1, 64, 2147483648, "Wall of text", [hundreds more])
现在,我正在从二进制文件中读取数据。二进制文件遵循这样的规范:第一个4字节值具有特定的含义,第二个值具有另一个含义,等等。
经过30分钟的输入,我已经创建了一个类型,其中包含与二进制文件规范相对应的所有字段。这些字段的顺序与对应值在二进制文件中出现的顺序相同。
我真正想要的是不需要输入300行代码来初始化对象:
bar2 = Bar(# here I describe what 'a' is
read(f, Int32, 1)[0],
# here I describe what 'b' is
read(f, Int32, 1)[0],
[...],
# here I describe what 'j' is
read(f, ASCIIString, 1)[0],
[...],
# this is getting long and tedious
[...])
在我的C中设置,我可以用2-3行代码将二进制数据fread()
到一个结构体中。有什么方法可以让我模仿Julia的那种轻松吗?
下面的代码片段可能会有所帮助:
immutable TwoFloats
f1::Float32
f2::Float32
end
newtwofloats = reinterpret(TwoFloats, rand(Uint8, 8*2))
# Gives an array with two elements of type TwoFloats
dump(newtwofloats[1]) # Print them...
dump(newtwofloats[2]) # ... out
所以你可以创建你的类型,假设它的所有部分都很简单,它就可以工作了。你怎么能读取一个ascii字符串,虽然没有事先知道它有多长?这在C语言中也行不通。这种方式只能读取基本位类型