0

我是 F# 新手,我有一个(可能很简单)问题。

下面代码的目的是将序列(字节流)中的值复制到数组myarray_中,保持数组的大小thesize,并将其他元素设置为零。

我可以看到在 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)
4

2 回答 2

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|]
于 2012-09-22T16:27:02.023 回答
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

其中实例仅在默认构造函数中构造一次。

于 2012-09-22T16:25:50.823 回答