Tag: closures

为什么我们需要纤维

对于纤维我们有一个经典的例子:生成斐波那契数 fib = Fiber.new do x, y = 0, 1 loop do Fiber.yield yx,y = y,x+y end end 为什么我们需要纤维? 我可以用相同的Proc重写这个(实际上是closures的) def clsr x, y = 0, 1 Proc.new do x, y = y, x + y x end end 所以 10.times { puts fib.resume } 和 prc = clsr 10.times { puts prc.call } 将返回相同的结果。 […]

函数指针,闭包和Lambda

我现在正在学习函数指针,而当我准备好关于这个主题的K&R章节时,第一个打到我的是“嘿,这有点像闭包。 我知道这个假设在某种程度上是根本错误的,在线search之后并没有真正find对比的分析。 那么为什么C风格函数指针与闭包或lambdas根本不同? 据我所知,与函数指针仍然指向一个已定义的(已命名的)函数,而不是能够匿名定义该函数有关。 为什么要传递一个函数到第二种情况下更强大的函数中,而第二种情况下它是未命名的,而第一种情况只是一个正常的日常函数而已? 请告诉我如何以及为什么我错误地比较两者如此密切。 谢谢。

在Swift中存储一个闭包作为variables

在Objective-C中,您可以定义一个块的input和输出,将其中一个块传入方法中,然后再使用该块: // 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 { … self.progressHandler = [handler copy]; … […]

我应该怎样调用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和AFTER那个调用结束,然后调用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); })); 三个animation同时开始 我的错误在哪里?

访问修改的closures(2)

这是从Access到修改closures的问题的扩展。 我只是想validation以下是否足够安全的生产使用。 List<string> lists = new List<string>(); //Code to retrieve lists from DB foreach (string list in lists) { Button btn = new Button(); btn.Click += new EventHandler(delegate { MessageBox.Show(list); }); } 我每次启动时只运行一次。 现在看来工作好了。 正如Jon在某些情况下所提到的违反直觉的结果。 那么我需要在这里注意什么? 如果列表多次运行,会不会好?

这个JavaScript模式叫什么?为什么使用它?

我正在学习THREE.js并注意到一个模式,其中的function定义如下: var foo = ( function () { var bar = new Bar(); return function ( ) { //actual logic using bar from above. //return result; }; }()); (例子见这里的 raycast方法)。 这种方法的正常变化看起来像这样: var foo = function () { var bar = new Bar(); //actual logic. //return result; }; 比较第一个版本和正常的版本,第一个版本似乎有所不同: 它分配自执行function的结果。 它在这个函数中定义了一个局部variables。 它返回包含使用局部variables的逻辑的实际函数。 所以主要区别在于,在第一个变体中,在初始化时,条只被分配一次,而第二个变体在每次被调用时创build这个临时variables。 我最好的猜测是为什么使用它,它限制了实例的数量(只有一个),从而节省了内存pipe理开销。 我的问题: 这个假设是否正确? […]

如何使用Swift @autoclosure

我注意到在Swift中编写一个assert时,第一个值被input为 @autoclosure() -> Bool 用重载方法返回一个通用的T值,通过LogicValue protocol来testing是否存在。 但是严格地坚持这个问题。 它似乎想要一个@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

这个对象生命周期扩展闭包是一个C#编译器错误吗?

当我碰到C#编译器(如果有问题的话)的一些非常好奇的代码的时候,我正在回答关于closures(合法地)延长对象生命期的可能性的问题。 最短的repro我可以find如下: 在调用包含types的静态方法的同时创build一个捕获本地的lambda。 将生成的委托引用分配给包含对象的实例字段。 结果:编译器创build一个闭包对象,该闭包对象引用创buildlambda的对象,当它没有理由时 – 委托的“内部”目标是一个静态方法,并且lambda创build对象的实例成员不需要当代表执行时,(而不是)被触摸。 实际上,编译器就像程序员没有理由地捕捉到了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 this doing […]

Python非本地语句

Python nonlocal语句做了什么(在Python 3.0和更高版本中)? Python官方网站上没有任何文档, help("nonlocal")也不起作用。

从DialogFragment接收结果

我正在使用DialogFragments的许多事情:从列表中select项目,input文本。 什么是最好的方式返回一个值(即从列表中的string或项目)回到调用活动/片段? 目前,我正在使调用活动实现DismissListener并给DialogFragment一个参考活动。 然后Dialog调用活动中的OnDimiss方法,活动从DialogFragment对象中获取结果。 非常混乱,而且在DialogFragment失去对活动的引用时,它不能在configuration更改(方向更改)上工作。 谢谢你的帮助。