Я не думаю, что в черте Iterator
есть for_each_ref
. Но вы можете написать свой собственный довольно легко (детская площадка) :
trait MyIterator {
fn for_each_ref<F>(self, mut f: F)
where
Self: Iterator + Sized,
F: FnMut(&Self::Item),
{
self.for_each(|x| f(&x));
}
}
impl<I: Iterator> MyIterator for I {}
borrowed_structs
.into_iter()
.for_each_ref(MyStruct::my_method);
Другой вариант, если вы можете изменить прототип функции my_method
, вы можете заставить его принимать значение либо по значению, либо по ссылке с заемом:
impl MyStruct {
fn my_method(prm: impl Borrow<BorrowedStruct>) {
let prm = prm.borrow();
prm.say_hello();
}
}
И тогда ваш оригинальный код с .for_each(MyStruct::my_method)
просто работает.
Третий вариант - использовать универсальную функцию-обертку (детская площадка) :
fn bind_by_ref<T>(mut f: impl FnMut(&T)) -> impl FnMut(T) {
move |x| f(&x)
}
И затем вызвать упакованную функцию с помощью .for_each(bind_by_ref(MyStruct::my_method));
.