変更可能な値はクロージャーでは使用できませんが、for .. in
の式はokです。 C#ではforループがイテレータを更新しますが、F#ではそうではありません。方法と理由?なぜ閉鎖で許可されたのか?
4
A
答えて
14
F#のfor .. in
はC#のforeach
ループと同じですが、C#のfor
ループではありません。そしてC#5以来、foreach
ループはではありません。イテレータを更新します。あなたは
for txt in ["abc"; "def"; "ghi"] do
printfn "%s" txt
を書くならば、あなたが実際に3を作成している:これは、F#は何もあり詳細はForeach now captures variables! (Access to modified closure)を参照してください、それは代わりに、これは閉鎖のために重要な意味を持っている(ループを通して各反復のための新しい変数を作成し、新しい文字列変数にあなたがそのループを実行するだけではなく、1
次-非常に機能的でないコードを試し、F#は新しい変数を毎回作成されていることを自分自身に証明するために:。
let actions = new System.Collections.Generic.List<System.Action<unit>>()
for txt in ["abc"; "def"; "ghi"] do
actions.Add(fun() -> printf "%s " txt)
for action in actions do
action.Invoke()
txt
がfor .. in
ループで毎回同じ変数だった場合は、C#4以前と同様にghi ghi ghi
が出力されます。匿名関数が変数の上で閉じ、ループの後に変数ghi
が含まれるためです。しかし、上記のコードを実行すると、C#5以降のようにabc def ghi
が表示されます。
だからあなたの質問への答えは、それが実際には何もを変異ていないので、F#が閉鎖にfor .. in
を可能にすることです。
関連する問題
- 1. 閉鎖が予想され、別の閉鎖を見つけた
- 2. 継承されたメンバーがなぜ許可されないのですか?
- 3. Trelloのアーカイブカードが閉鎖されているのはなぜですか?
- 4. 非常に閉鎖されたjavascriptではUserscriptsが可能ですか?
- 5. 標準がしばしば閉鎖されるのはなぜですか?
- 6. Google Places API - 閉鎖されたPOI?
- 7. TypeScriptでコンパイルが許可されるのはなぜですか?
- 8. ブラウザでCSRFが許可されるのはなぜですか?
- 9. なぜ[Errno 13]許可が拒否されましたか?
- 10. これは閉鎖ですか?もしそうなら、なぜですか?
- 11. setで可変オブジェクトが許可されていない場合、なぜリストを許可するのですか?
- 12. WCF:閉鎖されたストリームにアクセスできない
- 13. intはなぜ[+] C++で許可されていますか?
- 14. Python Enumで可変値が許可されるのはなぜですか?
- 15. なぜ閉鎖からvuejsインスタンス変数にアクセスできないのですか?
- 16. 空の宣言はなぜ許可されますか?
- 17. ResultSetが閉じられた後に操作が許可されない(JSP)
- 18. Checkstyleで保護された変数がデフォルトで許可されないのはなぜですか?
- 19. なぜC++でテンプレートのオーバーロードが許可されないのですか?
- 20. なぜthisキーワードがjavaのmainメソッドで許可されないのですか
- 21. 閉鎖のクロージャーで所有されていない自己
- 22. WCFでメソッドオーバーロードが許可されないのはなぜですか?
- 23. Visual Studio 2010でデバッグモードが許可されないのはなぜですか?
- 24. なぜchmod 777がrwxrwxrwxファイルで許可されていないのですか?
- 25. "use"バインディングでパターンが許可されないのはなぜですか?
- 26. ここで「void」型が許可されないのはなぜですか?
- 27. このデフォルトのテンプレートパラメータは許可されないのはなぜですか?
- 28. 閉鎖されたNetworkStreamを再オープンしますか?
- 29. ラケット - 閉鎖と適用 - 閉鎖
- 30. スイッチケースのフォールスルーコンセプトが迅速に許可されないのはなぜですか?
偉大な答え、thanx。 – aikixd