タグ付けされた質問 「closures」

クロージャは、それが定義されたスコープの変数を参照する(閉じる)ファーストクラスの関数です。定義されたスコープが終了した後もクロージャーがまだ存在する場合、クローズする変数も存在し続けます。

3
ラムダクロージャの左辺値を右辺値参照パラメータとして渡すことができます
lvalueラムダクロージャーは常にrvalue関数パラメーターとして渡すことができることがわかりました。 次の簡単なデモをご覧ください。 #include <iostream> #include <functional> using namespace std; void foo(std::function<void()>&& t) { } int main() { // Case 1: passing a `lvalue` closure auto fn1 = []{}; foo(fn1); // works // Case 2: passing a `lvalue` function object std::function<void()> fn2 = []{}; foo(fn2); // compile error return 0; } …

2
`std :: mem :: drop`が上位のトレイト境界のクロージャ| _ |()とまったく同じではないのはなぜですか?
の実装はstd::mem::drop次のように文書化されています。 pub fn drop<T>(_x: T) { } そのため、クロージャー|_| ()(通称、トイレクロージャー)dropは、双方向での1対1の交換の可能性があると予想します。ただし、以下のコードdropは、これが関数のパラメーターにバインドされたより高いランクの特性と互換性がないことを示していますが、トイレのクロージャーは互換性があります。 fn foo<F, T>(f: F, x: T) where for<'a> F: FnOnce(&'a T), { dbg!(f(&x)); } fn main() { foo(|_| (), "toilet closure"); // this compiles foo(drop, "drop"); // this does not! } コンパイラのエラーメッセージ: error[E0631]: type mismatch in function arguments --> src/main.rs:10:5 | …

1
忘れてメモリリークを使用する代わりに、Rustを使用してWebAssemblyでクロージャを処理するより良い方法は何ですか?
Closuresを使用してJavaScriptにコールバックを提供するとき、それらを解放しないように対処するためのより良い方法は何ですか?wasm-bindgenガイドを使用して示唆し.forget、それは本質的にメモリをリークしていることを認めています。 通常は、後で適切なタイミングでドロップされるようにハンドルを格納しますが、今のところ、それをグローバルハンドラーにして、forgetメソッドを使用して、クロージャーを無効にすることなくそれをドロップします。これはRustでメモリリークを起こしているので注意してください。 これは、ドロップするのが適切になるまでクロージャーを保管することを示します。でalexcrichtonの答えに、前の質問に、彼は言及します... [...]一度しか呼び出されない場合は、[ Rc/] RefCellを使用しClosureて、クロージャー自体の内部をドロップできます(内部の可変性シェナンを使用します)。 しかし、彼はこの方法の例を提供していません。 閉鎖のマニュアルには、参照を解放するときに処理させるためにはJavaScriptコンテキストに閉鎖への参照を返す例を示します。 cbここにドロップすると、間隔が経過するたびに例外が発生します。代わりに、私たちは、返し JSが間隔をキャンセルし、閉鎖を解放する際に決めることができるように私たちのハンドルバックはJSに。 また#[wasm_bindgen]、この問題を回避するために、パブリック関数のライフタイムやマクロなどの機能を使用する方法もあると思いますが、その方法を理解するのに苦労しています。 私の質問は、.forgetRustからJavaScriptに返されるクロージャーを使用する代わりの選択肢は何ですか?また、使用中の各オプションの簡単な例をいくつか見ていただけますか?

2
メソッドパラメーターからのJava 8ラムダ可変変数キャプチャ?
私はjdk81212-b04、Eclipse 4.13で実行されているUbuntu LinuxでAdoptOpenJDK を使用しています。Swingにはラムダ内にラムダを作成するメソッドがあります。おそらく両方とも別々のスレッドで呼び出されます。これは次のようになります(疑似コード): private SwingAction createAction(final Data payload) { System.out.println(System.identityHashCode(payload)); return new SwingAction(() -> { System.out.println(System.identityHashCode(payload)); //do stuff //show an "are you sure?" modal dialog and get a response //show a file selection dialog //when the dialog completes, create a worker and show a status: showStatusDialogWithWorker(() -> new SwingWorker() …
8 java  lambda  closures 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.