gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:29:54 24 4
gpt4 key购买 nike

我正在构建一个 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com