Mutant item in Iterator :: find

I would like to use Iterator::findin libusb::Devicesan object that has this signature:

fn find<P>(&mut self, predicate: P) -> Option<Self::Item> 
    where Self: Sized, P: FnMut(&Self::Item) -> bool

I want to find a device with a specific vendor_idone that requires a call Device::device_descriptoron each device. However, a method device_descriptorfor each device is required &mut, and the find method only gives &.

Does this mean that it is impossible to use mutable methods for any of the Iterator methods ( find, filteretc.)?

Here is an example I'm trying to get:

let mut device = context
    .devices()
    .unwrap()
    .iter()
    .find(&mut |dev: &libusb::Device| { 
         dev.device_descriptor().unwrap().vendor_id() == vendor_id
     })
    .unwrap();

Here is the error I get:

error: cannot borrow immutable borrowed content `*dev` as mutable
+4
source share
1 answer

Does this mean that it is impossible to use mutable methods for any of the Iterator methods ( find, filteretc.)?

, F: Fn*(&Self::Item), . , (&mut) (&). :

let mut x = vec![10];
// (&x)[0] = 20; // not ok
(&mut x)[0] = 20; // ok

//(& (&x))[0] = 20; // not ok 
//(& (&mut x))[0] = 20; // not ok
(&mut (&mut x))[0] = 20; // ok

, auto deref.

Iterator F: Fn*(Self::Item), map, filter_map .. , .


: Fn*(&Self::Item) Fn*(Self::item)?

, , filter ( , true), Self::Item , , . filter &Self::Item, .

, , map filter_map, , ( ), Self::Item.


, filter_map filter , , :

extern crate libusb;

fn main() {
    let mut context = libusb::Context::new().expect("context creation");

    let mut filtered: Vec<_> = context.devices()
        .expect("devices list")
        .iter()
        .filter_map(|mut r| {
            if let Ok(d) = r.device_descriptor() {
                if d.vendor_id() == 7531 {
                    return Some(r);
                }
            }
            None
        })
        .collect();

    for d in &mut filtered {
        // same as: for d in filtered.iter_mut()
        println!("{:?}", d.device_descriptor());
    }
}

filter_map None Some s.

+5

All Articles