Closed
Description
The following does not compile:
use std::ffi::OsString;
use std::io::{Result as IoResult};
use std::path::Path;
fn main() {
let paths: Vec<OsString> = vec!["filename".into()];
// Switching these two lines appeases our lord and savior the borrow checker
let f = std::fs::rename;
let dests = paths.clone();
// ---------------------------
let pairs = paths.iter().zip(dests.iter());
// ----- borrow occurs here
foo(f, pairs);
}
// `dests` does not live long enough.
// ^ `dests` dropped here while still borrowed
fn foo<P, I>(f: fn(P, P) -> IoResult<()>, pairs: I)
where P: AsRef<Path>,
I: Iterator<Item=(P, P)>,
{
for (src, dest) in pairs {
let _ = f(src, dest);
}
}
EDIT: simplified code.