0

私はF#の初心者であり、(おそらく単純な)質問があります。

以下のコードの目的は、シーケンス(バイトストリーム)から配列に値をコピーし、配列myarray_のサイズを維持し、thesize他の要素をゼロに設定することです。

forループでコピーされている値を確認できます。しかし、コンストラクターを離れた後、デバッガーはmyarray_、新しく構築されたオブジェクトのすべてにゼロが含まれていることを示します。

VS2012を使用しています。ありがとう。

編集:受信者配列のサイズは、常に着信シーケンスのサイズよりも大きくなります。

編集:このSomeClassのオブジェクトは、実際には外部クラスのメンバーとしてインスタンス化されます。これが、「SomeClass」のコンテキストとともにです。メインプログラムがOuterClass.Funcを呼び出すと、「cp」オブジェクトが作成され、配列が適切に設定されます。コードがコンストラクターを離れるとき、配列にはすべてゼロが含まれるか、サイズゼロになります(以下のコメントを参照)。

**解決しましたか?**:「cp」を「member」から「letmutable」に変更しました...現在は機能しているようです。理由がわからない。

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

可変値として宣言する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回だけ構築されます。

于 2012-09-22T16:25:50.823 に答える
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 に答える