我是F#新手,我有一个(可能是简单的)问题。
以下代码的目的是将序列(字节流)中的值复制到数组myarray_
中,保持数组thesize
的大小,并将其他元素设置为零。 / p>
我可以看到在for循环中复制的值。但在离开构造函数后,调试器显示新构造的对象的myarray_
包含全零!
我正在使用VS2012。感谢。
编辑:收件人数组的大小始终大于传入序列的大小。
编辑:此SomeClass的对象实际上是实例化为外部类的成员。这里是'SomeClass'中的更多上下文。 当主程序调用OuterClass.Func时,会创建“cp”对象,并正确填充数组。当代码离开ctor时,数组要么包含全零,要么 大小为零(参见下面的注释)。
** 已解决? **:我将“cp”从“member”更改为“let mutable”......现在似乎正常工作。不确定理解为什么。
type SomeClass(thesize, bytestream : seq<byte>) = class
let mutable myarray_ = Array.create<byte> thesize 0uy
do
let mutable idx = 0
for v in bytestream do
myarray_.[idx] <- v
idx <- idx + 1
member x.Func(index) = // consumes myarray_.[index] and neighbor values
type OuterClass(thesize, bytestream) = class
member x.cp : SomeClass = new SomeClass(thesize, bytestream)
member x.Func(index) =
x.cp.Func(index)
答案 0 :(得分:2)
您将myarray_
声明为可变值,因此可以将其分配给代码中某处新创建的数组。您不应该使用mutable
关键字,因为您要更新数组元素,而不是将数组更改为新数组。
假设thesize
大于bytestream
的长度:
type SomeClass(thesize, bytestream : seq<byte>) =
let myarray_ = [| yield! bytestream
for i in (Seq.length bytestream)..(thesize-1) -> 0uy |]
....
修改强>
用
member x.cp : SomeClass = new SomeClass(thesize, bytestream)
每次使用该属性时,您基本上都会实例化SomeClass
的新实例。因此,您不会看到x.Func
对旧SomeClass
的影响。你可能想要的是:
type OuterClass(thesize, bytestream) =
let cp = new SomeClass(thesize, bytestream)
member x.cp = cp
其中实例仅在默认构造函数中构造一次。
答案 1 :(得分:2)
type SomeClass(size, bytes : seq<byte>) =
let buf = Array.zeroCreate size
do
// Here code assumes that size is always greater than number of items in bytes, is it always correct ?
Seq.iteri(fun i b -> buf.[i] <- b) bytes
member this.Buffer = buf
let v = SomeClass(5, (List.init 3 byte))
printfn "%A" v.Buffer // printf [|0uy; 1uy; 2uy; 0uy; 0uy|]