如何在 gtk-rs 闭包中设置变量?



我正在构建一个降价应用程序,我想保留文本的两个副本,一个是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生存期的闭包,即没有捕获对局部变量的引用的闭包。

相关内容

  • 没有找到相关文章