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

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

9
C#のループでキャプチャされた変数
C#に関する興味深い問題に遭遇しました。以下のようなコードがあります。 List<Func<int>> actions = new List<Func<int>>(); int variable = 0; while (variable < 5) { actions.Add(() => variable * 2); ++ variable; } foreach (var act in actions) { Console.WriteLine(act.Invoke()); } 0、2、4、6、8が出力されると思いますが、実際には5つの10が出力されます。 これは、1つのキャプチャされた変数を参照するすべてのアクションが原因であると思われます。その結果、それらが呼び出されると、すべて同じ出力になります。 この制限を回避して、各アクションインスタンスに独自のキャプチャされた変数を持たせる方法はありますか?

6
匿名の再帰的なPHP関数
再帰的かつ匿名のPHP関数を持つことは可能ですか?これは機能させるための私の試みですが、関数名を渡しません。 $factorial = function( $n ) use ( $factorial ) { if( $n <= 1 ) return 1; return $factorial( $n - 1 ) * $n; }; print $factorial( 5 ); これは階乗を実装するための悪い方法であることも知っています。これは単なる例です。


8
var self = this?
イベントハンドラのコールバックがの範囲に変更とインスタンスメソッドを使用してthisから、「マイインスタンス」と「ただのコールバックと呼ばれるものは何でもします」。だから私のコードはこのようになります function MyObject() { this.doSomething = function() { ... } var self = this $('#foobar').bind('click', function(){ self.doSomethng() // this.doSomething() would not work here }) } 機能しますが、それが最善の方法ですか?それは私には奇妙に見えます。

5
Swiftのオプションのエスケープクロージャーパラメーター
与えられた: typealias Action = () -> () var action: Action = { } func doStuff(stuff: String, completion: @escaping Action) { print(stuff) action = completion completion() } func doStuffAgain() { print("again") action() } doStuff(stuff: "do stuff") { print("swift 3!") } doStuffAgain() 作るためにどのような方法があるcompletionパラメータは、(とaction)タイプのAction?とも続けますか@escaping? タイプを変更すると、次のエラーが発生します。 @escaping属性は関数型にのみ適用されます @escaping属性を削除すると、コードはコンパイルされて実行されますが、completionクロージャーが関数のスコープをエスケープしているため、正しくないようです。

11
3つの関数を順番に実行するには、どのように呼び出す必要がありますか?
この関数を次々と呼び出す必要がある場合は、 $('#art1').animate({'width':'1000px'},1000); $('#art2').animate({'width':'1000px'},1000); $('#art3').animate({'width':'1000px'},1000); 私はjQueryで次のようなことができることを知っています: $('#art1').animate({'width':'1000px'},1000,'linear',function(){ $('#art2').animate({'width':'1000px'},1000,'linear',function(){ $('#art3').animate({'width':'1000px'},1000); }); }); しかし、jQueryを使用しておらず、呼び出したいとしましょう。 some_3secs_function(some_value); some_5secs_function(some_value); some_8secs_function(some_value); どのように私は実行するために、この関数を呼び出す必要がありsome_3secs_function、そのコールが終了した後、その後、実行some_5secs_functionし、そのコールが終了した後、コールsome_8secs_function? 更新: これはまだ機能しません: (function(callback){ $('#art1').animate({'width':'1000px'},1000); callback(); })((function(callback2){ $('#art2').animate({'width':'1000px'},1000); callback2(); })(function(){ $('#art3').animate({'width':'1000px'},1000); })); 3つのアニメーションが同時に開始します 私の間違いはどこですか?

9
字句閉鎖はどのように機能しますか?
私はJavascriptコードの字句クロージャーで発生した問題を調査していたところ、Pythonでこの問題に遭遇しました。 flist = [] for i in xrange(3): def func(x): return x * i flist.append(func) for f in flist: print f(2) この例では注意深く回避していlambdaます。意外と「4 4 4」と印刷されます。「0 2 4」を期待します。 この同等のPerlコードはそれを正しく行います: my @flist = (); foreach my $i (0 .. 2) { push(@flist, sub {$i * $_[0]}); } foreach my $f (@flist) { print …

6
Swift @autoclosureの使い方
assertSwiftでを書いているときに、最初の値が次のように入力されていることに気付きました @autoclosure() -> Bool をT介して存在をテストするために、ジェネリック値を返すオーバーロードされたメソッドを使用しLogicValue protocolます。 しかし、目の前の質問に厳密に固執します。@autoclosureを返すが必要なようですBool。 パラメータをとらずにBoolを返す実際のクロージャを書くことは機能しません、それは私がそれをコンパイルするためにクロージャを呼び出すことを望みます、それはそうです: assert({() -> Bool in return false}(), "No user has been set", file: __FILE__, line: __LINE__) ただし、ブール値を渡すだけで機能します。 assert(false, "No user has been set", file: __FILE__, line: __LINE__) それで、何が起こっているのですか?なに@autoclosure? 編集: @auto_closure名前が変更されました@autoclosure
148 closures  swift 

7
クロージャーを変数としてSwiftに保管する
Objective-Cでは、ブロックの入力と出力を定義し、メソッドに渡されたブロックの1つを保存して、後でそのブロックを使用できます。 // in .h typedef void (^APLCalibrationProgressHandler)(float percentComplete); typedef void (^APLCalibrationCompletionHandler)(NSInteger measuredPower, NSError *error); // in .m @property (strong) APLCalibrationProgressHandler progressHandler; @property (strong) APLCalibrationCompletionHandler completionHandler; - (id)initWithRegion:(CLBeaconRegion *)region completionHandler:(APLCalibrationCompletionHandler)handler { self = [super init]; if(self) { ... _completionHandler = [handler copy]; .. } return self; } - (void)performCalibrationWithProgressHandler:(APLCalibrationProgressHandler)handler { ... …

2
エスケープしないパラメーターをクロージャーで使用すると、エスケープできる可能性があります
私はプロトコルを持っています: enum DataFetchResult { case success(data: Data) case failure } protocol DataServiceType { func fetchData(location: String, completion: (DataFetchResult) -> (Void)) func cachedData(location: String) -> Data? } 実装例: /// An implementation of DataServiceType protocol returning predefined results using arbitrary queue for asynchronyous mechanisms. /// Dedicated to be used in various tests …

2
このオブジェクトの有効期限を延長するクロージャーはC#コンパイラのバグですか?
私がいくつかの極端に遭遇したとき、私はオブジェクトのライフタイムを(合法的に)延長する可能性についての質問に答えていましたC#コンパイラーの奇妙なコード生成(問題の場合は4.0。 私が見つけることができる最も短い再現は次のとおりです: staticを呼び出しているときにローカルをキャプチャするラムダを作成する 包含型のメソッド。 生成されたデリゲート参照を、それを含むオブジェクトのインスタンスフィールドに割り当てます。 結果:コンパイラーは、理由がない場合にラムダを作成したオブジェクトを参照するクロージャーオブジェクトを作成します。デリゲートの「内部」ターゲットは静的メソッドであり、ラムダ作成オブジェクトのインスタンスメンバーは不要です。デリゲートが実行されたときに触れられる(されない)。事実上、コンパイラーは、プログラマーがthis理由なしに取り込んだように機能します。 class Foo { private Action _field; public void InstanceMethod() { var capturedVariable = Math.Pow(42, 1); _field = () => StaticMethod(capturedVariable); } private static void StaticMethod(double arg) { } } リリースビルドから生成されたコード(「より単純な」C#に逆コンパイル)は、次のようになります。 public void InstanceMethod() { <>c__DisplayClass1 CS$<>8__locals2 = new <>c__DisplayClass1(); CS$<>8__locals2.<>4__this = this; // What's …

8
Playgroundで非同期コールバックを実行する方法
多くのCocoaおよびCocoaTouchメソッドには、Objective-CのブロックおよびSwiftのClosuresとして実装された完了コールバックがあります。ただし、プレイグラウンドでこれらを試してみると、完了が呼び出されることはありません。例えば: // Playground - noun: a place where people can play import Cocoa import XCPlayground let url = NSURL(string: "http://stackoverflow.com") let request = NSURLRequest(URL: url) NSURLConnection.sendAsynchronousRequest(request, queue:NSOperationQueue.currentQueue() { response, maybeData, error in // This block never gets called? if let data = maybeData { let contents = NSString(data:data, encoding:NSUTF8StringEncoding) println(contents) …

10
Python 2.xの非ローカルキーワード
Python 2.6でクロージャーを実装しようとしていますが、非ローカル変数にアクセスする必要がありますが、このキーワードはpython 2.xでは使用できないようです。これらのバージョンのpythonでクロージャー内の非ローカル変数にアクセスするにはどうすればよいですか?

1
クロージャーはいつFn、FnMut、FnOnceを実装しますか?
クロージャーが、およびトレイトを実装するための特定の条件は何ですか?FnFnMutFnOnce あれは: クロージャーはいつFnOnceトレイトを実装しないのですか? クロージャーはいつFnMutトレイトを実装しないのですか? クロージャーはいつFnトレイトを実装しないのですか? たとえば、本体のクロージャの状態を変更すると、コンパイラはそのクロージャを実装Fnしなくなります。
114 rust  closures 

12
オブジェクトプロパティに直接割り当てられたクロージャを呼び出す
変数にクロージャーを再割り当てしてそれを呼び出すことなく、オブジェクトのプロパティに直接割り当てるクロージャーを呼び出せるようにしたいのですが。これは可能ですか? 以下のコードは機能せず、原因となりFatal error: Call to undefined method stdClass::callback()ます。 $obj = new stdClass(); $obj->callback = function() { print "HelloWorld!"; }; $obj->callback();

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.