#rust
#Ржавчина
Вопрос:
Я реализую следующую функцию перетаскивания с помощью fltk-rs:
fn handleImageDrag(t:amp;mut Button, e:Event)->bool{
let mut dnd = false;
let mut released = false;
match e {
Event::DndEnter => {
dnd = true;
println!("{}", "did enter!");
println!("dnd value at DndEnter is: {}", dnd);
true
}
Event::DndDrag => true,
Event::DndRelease => {
released = true;
println!("released value at DndRelease is: {}", released);
true
}
Event::Paste => {
println!("{}", "did paste!");
println!("dnd value at Paste is: {}", dnd);
println!("released value at Paste is: {}", released);
// println!("{}", released);
if dnd amp;amp; released {
let img = image::open("imgs/3.jpg").unwrap();
let thumbnail = img.resize(400,400, FilterType::Lanczos3);
let (x, y) = thumbnail.dimensions();
let rgb = RgbImage::new(amp;thumbnail.to_bytes(), x, y, 3).unwrap();
t.set_image(Some(rgb));
dnd = false;
released = false;
true
} else {
false
}
}
Event::DndLeave => {
dnd = false;
released = false;
true
}
_ => false,
}
}
testBut2.handle2(move |t, ev| {handleImageDrag(t,ev)});
//dragging and dropping then prints:
did enter!
dnd value at DndEnter is: true
released value at DndRelease is: true
did paste!
dnd value at Paste is: false
released value at Paste is: false
Я инициализировал dnd и выпустил как изменяемые логические значения, поэтому я подумал, что могу изменить их значение в части функции match{} . Значения dnd и released изменяются в DnDEnter и DndRelease соответственно, но когда я получаю доступ к этим значениям в Paste, они не являются обновленными значениями. Являются ли переменные каким-то образом вне области видимости?
Комментарии:
1. Вы объявляете переменные внутри функции, поэтому значения существуют только для одного вызова функции. Они не изменяются между вызовами функций, это всегда будет
false
, когда это такEvent::Paste
.2. @Deadbeef итак, как мне сохранить значение между этими вызовами функции при объявлении переменных внутри функции?
3. В rust нет (безопасных) изменяемых глобальных переменных без объявления их как a
Mutex
. Если вы передаете указатель на функцию другой, рассмотрите возможность использования замыкания, чтобы вы могли изменять захваченное значение между вызовами.
Ответ №1:
Это сработало для меня:
let mut dnd = false;
let mut released = false;
imgSlot1.handle2(move |t, ev| {handleImageDrag(t,ev, amp;mut dnd, amp;mut released)});
fn handleImageDrag(t:amp;mut Button, e:Event, dnd:amp;mut bool, released: amp;mut bool)->bool{
// let mut dnd = false;
// let mut released = false;
match e {
Event::DndEnter => {
*dnd = true;
println!("{}", "did enter!");
println!("dnd value at DndEnter is: {}", dnd);
true
}
Event::DndDrag => true,
Event::DndRelease => {
*released = true;
println!("released value at DndRelease is: {}", released);
true
}
Event::Paste => {
println!("{}", "did paste!");
println!("dnd value at Paste is: {}", dnd);
println!("released value at Paste is: {}", released);
// println!("{}", released);
if *dnd amp;amp; *released {
let img = image::open("imgs/3.jpg").unwrap();
let thumbnail = img.resize(400,400, FilterType::Lanczos3);
let (x, y) = thumbnail.dimensions();
let rgb = RgbImage::new(amp;thumbnail.to_bytes(), x, y, 3).unwrap();
t.set_image(Some(rgb));
*dnd = false;
*released = false;
true
} else {
false
}
}
Event::DndLeave => {
*dnd = false;
*released = false;
true
}
_ => false,
}
}