Questions tagged «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个10s。 看来这是由于所有操作都引用了一个捕获的变量。结果,当它们被调用时,它们都具有相同的输出。 有没有办法解决这个限制,使每个动作实例都有自己的捕获变量?

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从“我的实例”更改为“无论什么叫回调”。所以我的代码看起来像这样 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); })); 三个动画同时开始 我的错误在哪里?

9
词汇闭包如何工作?
当我研究Java代码中的词法闭包问题时,我遇到了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) …

6
如何使用Swift @autoclosure
assert在Swift中编写时,我注意到第一个值键入为 @autoclosure() -> Bool 用重载的方法返回通用T值,并通过进行测试LogicValue protocol。 但是严格遵守眼前的问题。似乎要@autoclosure返回一个Bool。 编写不带任何参数并返回Bool的实际闭包是行不通的,它要我调用闭包使其进行编译,如下所示: assert({() -> Bool in return false}(), "No user has been set", file: __FILE__, line: __LINE__) 但是,仅通过Bool即可: assert(false, "No user has been set", file: __FILE__, line: __LINE__) 那么发生了什么?什么@autoclosure啊 编辑: @auto_closure已重命名@autoclosure
148 closures  swift 

7
将闭包作为变量存储在Swift中
在Objective-C中,您可以定义块的输入和输出,存储传递给方法的那些块之一,然后在以后使用该块: // 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,如果该事项)。 我能找到的最短的再现是: 创建一个lambda来捕获本地,同时调用包含类型的 静态方法。 将生成的委托引用分配给包含对象的实例字段。 结果:编译器在没有理由的情况下创建了一个引用创建lambda的对象的闭包对象-委托的“内部”目标是静态方法,而lambda-createing对象的实例成员不需要执行委托时(不被)触碰。实际上,编译器的行为就像程序员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; // …

8
如何在Playground中运行异步回调
许多Cocoa和CocoaTouch方法都将完成回调实现为Objective-C中的块,而实现为Swift中的Closures。但是,在Playground中尝试这些操作时,永远不会调用完成操作。例如: // 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) …


1
闭包何时实现Fn,FnMut和FnOnce?
哪些具体条件为闭合来实现Fn,FnMut和FnOnce特质? 那是: 什么时候关闭不实现该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();

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.