Переменная, не находящаяся в области соответствия в Rust

#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,
    }
}