看看这段代码
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#中进行封闭涉及拳击.
正如文章中所说,这行代码将通过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)
正如那里所解释的,编译器生成的类的对象被实例化以在该范围之外携带该变量的值.这是我的问题:由于变量确实位于堆栈上,使其成为对象的一部分,并不意味着闭包涉及拳击?
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 …
基于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)
考虑闭包何时以及如何比当前函数更长时间是抽象的; 你能提供任何例子或规格吗?
我正在阅读关于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) 我正在试图理解制造计数器程序的方案代码.这是一个更高阶的程序(程序输出另一个程序),我坚持下去.
(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个嵌套程序?它们的功能分别是什么?
如果有人详细解释,我将不胜感激.谢谢你们.
在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) 我写了这个
$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是空的.
是否有可能以这种方式填充数组?
我想知道如何使用闭包传递数据.我知道有三种类型的数据传递方法:
代表
通知中心
关闭
我希望通过一个例子对闭包进行适当的澄清.
可以围绕构造函数创建一个闭包,以保存实例的唯一ID:
const MyObject = (() => {
let id = 0;
return function() {
this.id = id++;
};
})();
Run Code Online (Sandbox Code Playgroud)
使用类语法如何实现相同的目的?有没有一种方法可以围绕类的constructor函数创建一个闭包?