さて、F# は参照 (ある種の C++ のような参照) を管理できることを理解するようになりました。これにより、関数に渡されるパラメーターの値を変更できるようになり、プログラマーが複数の値を返すことも可能になります。ただし、ここに私が知る必要があるものがあります:
Ref キーワード: キーワード
ref
は、値から、推論された型のその値への参照を作成するために使用されます。そうlet myref = ref 10
Ref<int>
これは、F#が (変更可能なフィールドに) my を置く型のオブジェクトを作成することを意味しますint 10
。わかった。したがって、それがタイプ
ref
のインスタンスを作成するために使用されると思います。Ref<'a>
それが正しいか?値へのアクセス: 参照に格納されている値にアクセスするには、次のようにします。
let myref = ref 10 let myval = myref.Value let myval2 = !myref
オペレーターは、
:=
次のように値を編集できるようにします。let myref = ref 10 myref.Value <- 30 myref := 40
したがって
!
、(Bang) は私の参照を逆参照します。そしてそれ:=
を編集します。これも正しいと思います。& 演算子: この演算子は何をしますか? 参照型に適用されますか? いいえ、変更可能な値に適用する必要があると思いますが、これは何を返しますか? 参照?住所・アドレス?インタラクティブを使用する場合:
let mutable mutvar = 10;; &a;;
&
最後の行でエラーがスローされるため、演算子の目的がわかりません。ByRef: はどう
byref
ですか?それは私にとって非常に重要なことですが、私はそれを理解していないことに気づきました。パラメータの受け渡しに関する関数で使用されていることを理解しています。渡された値を編集できるようにしたい場合は byref を使用します (これは関数型言語の哲学に少し反しますが、f# はそれ以上のものです)。次の点を考慮してください。let myfunc (x: int byref) = x <- x + 10
変ですね。
let myref = ref 10
参照があり、これを実行して値を編集すると、次のmyref <- 10
ようになるためエラーが発生することを私は知っています:myref := 10
。しかし、その関数で演算子x
を使用して編集できるということは、それは参照ではないということですよね?<-
x
それが参照ではないと仮定すると
x
、関数でパラメーターを使用byref
するときに、そのパラメーターに変更可能な構文を適用できると仮定します。したがって、これは構文の問題であり、これで問題ないと仮定すると、実際にはすべてが機能します (コンパイラ エラーは発生しません)。しかし、何x
ですか?関数の呼び出し: byref パラメーターを使用する関数を使用するにはどうすればよいですか?
&
オペレーターが関与していますが、これについてもっと詳しく説明していただけますか? この記事: MSDN のパラメーターと引数では、次の例が提供されています。type Incrementor(z) = member this.Increment(i : int byref) = i <- i + z let incrementor = new Incrementor(1) let mutable x = 10 // A: Not recommended: Does not actually increment the variable. (Me: why?) incrementor.Increment(ref x) // Prints 10. printfn "%d" x let mutable y = 10 incrementor.Increment(&y) (* Me: & what does it return? *) // Prints 11. printfn "%d" y let refInt = ref 10 incrementor.Increment(refInt) (* Why does it not work in A, but here it does? *) // Prints 11. printfn "%d" !refInt