标签: closures

委托内部循环如何理解本地和循环变量之间的区别

看看这段代码

    List<Action> actions = new List<Action>();
    for (int variable = 0; variable < 5; ++variable)
        {
            int myLocalVariable = variable;
            actions.Add(() => Console.WriteLine(myLocalVariable));
        }
    actions.ForEach(s => s.Invoke());
    Console.ReadLine();
Run Code Online (Sandbox Code Playgroud)

输出为0 1 2 3 4

看一下IL代码,我倾向于认为编译器只创建了一个myLocalVariable实例.这一事实也证实了在循环中使用局部变量的良好实践.

那么如何委托inside actions.Add()存储循环变量的"最新"版本.

c# closures loops

0
推荐指数
1
解决办法
97
查看次数

封闭是否涉及拳击?

在我问这个问题并阅读这篇关于闭包的推荐文章之后,我开始问自己,如果在C#中进行封闭涉及拳击.

正如文章中所说,这行代码将通过myVar在其范围之外存在来创建闭包:

public static Func<int,int> GetAFunc()
{
    var myVar = 1;
    Func<int, int> inc = delegate(int var1)
                            {
                                myVar = myVar + 1;
                                return var1 + myVar;
                            };
    return inc;
}
Run Code Online (Sandbox Code Playgroud)

正如那里所解释的,编译器生成的类的对象被实例化以在该范围之外携带该变量的值.这是我的问题:由于变量确实位于堆栈上,使其成为对象的一部分,并不意味着闭包涉及拳击?

c# boxing closures

0
推荐指数
1
解决办法
354
查看次数

UIView, CMDeviceMotionHandler : unowned may only be applied to class and class-bound protocol types

I'm creating a UIView that listens to CMDeviceMotion Events:

class MyView: UIView{


    private var motionManager = CMMotionManager()
    let motionQueue = NSOperationQueue()


    override func awakeFromNib() {
        self.setupView()
    }

    func setupView(){
        self.motionManager.deviceMotionUpdateInterval = 0.5
        self.motionManager.startDeviceMotionUpdatesUsingReferenceFrame(.XArbitraryZVertical, toQueue: self.motionQueue, withHandler: self.motionHandler)
    }

    // MARK: - CMDeviceMotionHandler

    let motionHandler : CMDeviceMotionHandler = {
        [unowned self] (motion,error) in
    }
}
Run Code Online (Sandbox Code Playgroud)

I'd like to declare my CMDeviceMotionHandler closure as a member variable however I get the error:

'unowned' may only be applied to class and class-bound protocol …

closures swift

0
推荐指数
1
解决办法
1182
查看次数

你能提供闭包超过当前功能的任何例子吗?

基于Rust书,以下代码可能导致closure may outlive the current function错误:

use std::thread;

fn main() {
    let x = 1;
    thread::spawn(|| {
        println!("x is {}", x);
    });
}
Run Code Online (Sandbox Code Playgroud)

考虑闭包何时以及如何比当前函数更长时间是抽象的; 你能提供任何例子或规格吗?

concurrency closures rust

0
推荐指数
1
解决办法
153
查看次数

JavaScript - 闭包

我正在阅读关于Mozilla开发者网站上的闭包的解释,并且我正在苦苦挣扎.请查看Mozilla网站上的以下代码.我有点理解它是如何工作的,但我认为我的评论下面的代码也应该有效.如果点击18和20,为什么它不起作用?

/* mozilla dev code */
function makeSizer(size) {
  return function() {
      document.body.style.fontSize = size + 'px';
    };
}

var size12 = makeSizer(12);
var size14 = makeSizer(14);
var size16 = makeSizer(16);

document.getElementById('size-12').onclick = size12;
document.getElementById('size-14').onclick = size14;
document.getElementById('size-16').onclick = size16;
/* end of mozilla dev example */
/* my code starts */
/* see - no inner function below */

function makeS(size) {
        document.body.style.fontSize = size + 'px'
}
/* Let's see if that works */

var size18 = makeS(18); …
Run Code Online (Sandbox Code Playgroud)

javascript closures

0
推荐指数
1
解决办法
110
查看次数

为什么make-counter过程包含两个lambda定义?

我正在试图理解制造计数器程序的方案代码.这是一个更高阶的程序(程序输出另一个程序),我坚持下去.

(define make-counter
  (lambda (n)
    (lambda () 
      (set! n (+ n 1))
      n)))

(define ca (make-counter 0))
(ca)
(ca)
Run Code Online (Sandbox Code Playgroud)

它按预期分别输出1和2.为什么我们需要2个嵌套程序?它们的功能分别是什么?

如果有人详细解释,我将不胜感激.谢谢你们.

lisp scheme counter closures

0
推荐指数
1
解决办法
79
查看次数

Javascript:为什么我可以访问在全局范围内的函数内声明的内部名称?

在chrome开发控制台中,我创建了一个带有两个嵌入功能的函数f

> var a = 'ga';
  var b = 'gb';
  var c = 'gc';
  var f = function(){
      var a = 'fa';
      var b = 'fb';
      ff = function(){
          var a = 'ffa';
          fff = function(){
              console.log("a,b,c is: " + a + "," + b + "," + c);
          };
          fff();
      };
      ff();
  };
< undefined
Run Code Online (Sandbox Code Playgroud)

然后,我输入ff到控制台,发现我仍然可以访问它,而它是在内部范围内定义的f

> ff     // why can I still access the name ff ?
< function (){
         var a = 'ffa';
         fff …
Run Code Online (Sandbox Code Playgroud)

javascript closures scope

0
推荐指数
1
解决办法
56
查看次数

如何在PHP中的闭包之外填充数组?

我写了这个

 $result = array();

        array_map(function($row) use ($result) {
            $result[$row->id] = array();
            $result[$row->id]['geojson'] = $row->geojson;
        }, $regions);
Run Code Online (Sandbox Code Playgroud)

并且最后$result是空的.

是否有可能以这种方式填充数组?

php closures hashmap

0
推荐指数
1
解决办法
59
查看次数

如何使用闭包在两个ViewController之间传递数据

我想知道如何使用闭包传递数据.我知道有三种类型的数据传递方法:

  • 代表

  • 通知中心

  • 关闭

我希望通过一个例子对闭包进行适当的澄清.

iphone closures ios swift swift3

0
推荐指数
1
解决办法
3735
查看次数

关闭ES2015(ES6)类中的类构造函数

可以围绕构造函数创建一个闭包,以保存实例的唯一ID:

const MyObject = (() => {
  let id = 0;

  return function() {
    this.id = id++;
  };
})();
Run Code Online (Sandbox Code Playgroud)

使用类语法如何实现相同的目的?有没有一种方法可以围绕类的constructor函数创建一个闭包?

javascript closures class ecmascript-6

0
推荐指数
1
解决办法
685
查看次数

标签 统计

closures ×10

javascript ×3

c# ×2

swift ×2

boxing ×1

class ×1

concurrency ×1

counter ×1

ecmascript-6 ×1

hashmap ×1

ios ×1

iphone ×1

lisp ×1

loops ×1

php ×1

rust ×1

scheme ×1

scope ×1

swift3 ×1