- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在构建一个 Markdown 应用程序,我想保留文本的两份副本,一份是 source
文本,另一份是包含所有正确内容的 TextBuffer
标签之类的。
我需要在闭包中设置这个源字段的内容:
buffer.connect_begin_user_action(clone!(source => move |a| {
let text = a.get_text(&a.get_start_iter(), &a.get_end_iter(), false).unwrap();
source = text; // error: cannot assign to captured outer variable in an `Fn` closure
另一种可能是在 TextBuffer
上设置一些属性,但我不知道这是否可行。
最佳答案
TextBufferExt::connect_begin_user_action()
接受 Fn
-闭包,即不能改变其捕获环境的闭包。当您需要更改无法更改的内容时,可以使用具有内部可变性的类型,例如 RefCell
.
如果你要调整 source
的类型至 RefCell<String>
并将闭包内的分配更改为 *source.borrow_mut() = text;
,代码将编译,但还有另一个问题。您为克隆的 source
赋值.
宏clone!
扩展为
{
let source = source.clone();
move |a| {
let text = // ...
// ...
}
}
也就是说,闭包捕获并更改了变量source
的副本。 ,不是原始变量。 Rc
是做你想做的事情的方法之一
use std::cell::RefCell;
use std::rc::Rc;
// ...
let source = Rc::new(RefCell::new("Text".to_string()));
// ...
buffer.connect_begin_user_action(clone!(source => move |a| {
let text = a.get_text(&a.get_start_iter(), &a.get_end_iter(), false).unwrap();
*source.borrow_mut() = text;
// ...
}));
另一种方法是删除 clone!
宏和捕获 source
通过引用(您需要在关闭前删除 move
),但在这种情况下它不会像 connect_begin_user_action()
一样工作期望关闭 'static
生命周期,这是一个没有捕获局部变量引用的闭包。
关于rust - 如何在 gtk-rs 闭包中设置变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45702112/
我在一个简单的 GTK 应用程序中有两个小部件: extern crate gdk; extern crate gtk; use super::desktop_entry::DesktopEntry;
我想做这样的事情: const vegetableColors = {corn: 'yellow', peas: 'green'}; const {*} = vegetableColors; cons
该属性它存储在 gradle 中的什么位置? subprojects { println it.class.name // DefaultProject_Decorated depen
我想在 jQuery 闭包中看到窗口属性“otherName”描述符。但 进入 jQuery 闭包 'otherName' 描述符显示未定义,我认为可能 是 getOwnPropertyDescrip
我曾经看过 Douglas Crockford 的一次演讲,在 javascript 的上下文中,他提到将 secret 存储在闭包中可能很有用。 我想这可以在 Java 中像这样天真地实现: pub
我很难理解 Swift 中闭包中真正发生的事情,希望有人能帮助我理解。 class MyClass { func printWhatever(words: String) {
我有两个 3 表:用户、个人资料、friend_request $my_profile_id变量存储用户个人资料ID的值 $my_user_id = Auth::user()->id; $my_pro
我正在尝试通过使用 GLFW 的包装来学习 Swift GLFW 允许添加错误回调: GLFWAPI GLFWerrorfun glfwSetErrorCallback(GLFWerrorfun cb
我是一名优秀的程序员,十分优秀!