- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
使用rust 0.12。
假设我有一个可发送的闭包,它的定义完全独立于应该在另一个任务中生成它的代码。
关闭类型:
type closure_type = ||: 'static + Send;
代码:
let do_stuff : closure_type = || println!("stuff"); // "uknown" procedure
let outer_fun = || {
spawn(proc() {
do_stuff();
});
};
outer_fun(); // someone else calls this
上面的例子编译失败,并在“proc()”范围内显示一条消息“无法移出捕获的外部变量”。为什么 outer_fun
捕获 do_stuff
变量(如果它未在那里使用)?
稍微修改后,我发现一种可能的解决方案是将 do_stuff
函数显式传递给 outer_fun
闭包(此编译):
let do_stuff : closure_type = || println!("stuff");
let outer_fun = | do_do_stuff: closure_type | {
spawn(proc() {
do_do_stuff();
});
};
outer_fun(do_stuff); // I don't want someone else to know about "do_stuff"!
但这关闭了其他人在不知道生成什么的情况下调用生成的可能性。
显然,我的大脑可能会因为无限制地使用 Javascript 而受到一些损伤,所以我必须谦虚地问:在 Rust 中完成这样的事情的正确方法是什么?
更新:只需在主回调上生成一个过程!呸。
let do_stuff = || spawn(proc() println!("Hello"));
let do_spawn = || {
do_stuff();
};
for i in range(1u, 10) {
do_spawn(); // Even multiple times.
}
最佳答案
Why does the
outer_fun
capturesdo_stuff
variable if it is not used there?
但它在那里使用! do_stuff
出现在闭包体内,闭包是词法的,所以do_stuff
必然被outer_fun
捕获。
目前闭包通过引用捕获每个变量。这很有用,因为它允许您改变“外部”变量,就好像闭包主体直接嵌入到外部代码中一样。但是,这确实会阻止您移出捕获的变量(因为这意味着移出引用)。
另一方面,proc()
的环境在堆上,并且只能调用一次。这意味着他们将每个捕获的值(value)转移到他们的环境中。但是,您正在尝试在 proc()
体内使用 do_stuff
(由 outer_fun
闭包捕获),这是通过引用捕获的并且无法移入 proc()
,因此这是您的错误。
我认为还不可能做您想做的事。目前有一个 accepted unboxed closures提议。适当的拆箱关闭将很快实现;特别是未装箱的闭包可以通过值捕获它们的环境,就像 proc()
一样(它将被显式装箱的未装箱闭包取代 [没有双关语意])。据我所知,当未装箱的闭包落地时,您将能够完全按原样编译您的第一个示例(只需将 proc()
更改为 box ||
或东西)。
关于closures - 将 spawn 的调用者与 spawned 过程分离的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25233680/
我刚刚开始使用 Google Closure 做一些工作,我想将选择字段的创建移动到它自己的模板中,并使用类似以下内容调用该模板: {call templates.utils.select} {p
我有一些代码,简化后看起来像: fn foo() -> Vec { unsafe { unsafe_iterator().map(|n| wrap_element(n)).co
我正在从脚本内部调用Closure Compiler(closurecompiler.jar)。该脚本还生成Closure Compiler需要编译的一些javascript。有没有办法将此JavaS
以下示例代码生成有关高级优化的编译器警告:“JSC_UNSAFE_NAMESPACE:为命名空间 NS 创建的别名不完整”。如果我删除@enum 注释,它不会发出警告。 var NS = {}; /*
看代码: let add_one = |&: x| { 1 + x }; 我知道x是闭包参数,但是闭包中的&:是什么意思? 最佳答案 这是 Rust 的一个文档不足的部分(并且过时,请参阅评论)。我知
PHP manual for anonymous functions (即闭包)指出: Anonymous functions are currently implemented using the
我从脚本内部调用 Closure Compiler (closurecompiler.jar)。该脚本还生成了一些 Closure Compiler 需要编译的 javascript。有没有办法将这个
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 7年前关闭。 Improve t
当鼠标在文档正文中移动时,我试图调用一个函数。但是,下面的事件处理程序不起作用。 goog.events.listen(document, 'onmousemove', function(e)
我试过了 java -jar compiler.jar --js jj.js --js_output_file jj.js 输出文件大小为 0。 如果我不想从 .min.js 重命名为 .js,我该怎
Google Closure UI库如何与Google DART一起使用? 最佳答案 Dart没有使用JavaScript库的功能。这是设计使然,因为Dart旨在同时针对Dart VM和转换为JS的D
是否可以使用 Google Closure 编译器在两个文件中定义一个类?例如,如果我自动生成一个类并希望为用户输入的代码保留另一个类: 在 MyClass.AutoGenerated.js 中 go
当我在 http://closure-compiler.appspot.com 处的闭包编译器中测试以下代码时: // ==ClosureCompiler== // @output_file_name
是否可以使用 Google Closure 编译器在两个文件中定义一个类?例如,如果我自动生成一个类并希望为用户输入的代码保留另一个类: 在 MyClass.AutoGenerated.js 中 go
当我运行闭包编译器时,会收到一堆这样的警告: [exec] jquery/3.2.1/dist/jquery.js:733: WARNING - Suspicious code. The resul
假设您正在一个具有多个外部库依赖项的 javascript 项目中工作,并且想要在 ADVANCED_OPTIMIZATIONS 模式下使用 Google Closure Compiler 编译您的源
我正在为 PIXI.js 库准备 externs。我收到以下警告: js/Test.js:188: WARNING - Property position never defined on PIXI.
我最近使用 Google 的 Closure 编译器创建了一个 JavaScript 库:https://github.com/bvaughn/task-runner 我打算让这个库供那些也需要完整闭
我正在尝试自学闭包模板。我做了一个简单的文件 simple.soy: {namespace examples.simple} /** * says hello to the world * @pa
我正在将一个项目从 jQuery 迁移到 Closure。我有一些我想编译的只迁移了一半的代码。未编译的源工作正常。我想知道使用 SIMPLE_OPTIMIZATIONS 编译它的编译命令。 原始基于
我是一名优秀的程序员,十分优秀!