TextBufferExt::connect_begin_user_action()
は、Fn
-closuresを受け入れます。つまり、キャプチャされた環境を変更できないクロージャです。変更できないものを変更する必要がある場合は、RefCell
のような内部の変更可能な型を使用できます。
のタイプをRefCell<String>
に調整し、クロージャ内の割り当てを*source.borrow_mut() = text;
に変更すると、コードはコンパイルされますが、別の問題があります。クローン化されたsource
に値を割り当てます。
マクロclone!
は、閉鎖捕捉され、可変source
ではなく、元の変数のコピーを変更
{
let source = source.clone();
move |a| {
let text = // ...
// ...
}
}
に展開します。 Rc
はあなたが別の方法は、マクロclone!
を削除し、参照することによりsource
をキャプチャ(あなたが閉鎖する前move
を削除する必要があります)が、この場合には、それはとして動作しませんされて
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;
// ...
}));
意図何をすべきかのいずれかの方法でありますconnect_begin_user_action()
は、生涯の'static
のクロージャーを必要とします。これは、ローカル変数への参照がキャプチャされていないクロージャーです。
なぜこのライブラリを使用すると、残りの言語のセマンティクスとルールが変更されると思いますか?言い換えれば、なぜあなたはgtk-rsが使用されていることが重要だと思いますか?これは、「錆止めの内側に変数を設定する方法」という仮説的な質問の複製として閉じられるでしょうか? – Shepmaster
質問の名前を変更するかどうかわかりません。 – thouliha