构造函数后F#数组成员值丢失

时间:2012-09-22 16:17:52

标签: arrays f# constructor sequence

我是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)

2 个答案:

答案 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|]