Если вы посмотрите на headers
подпись , это:
fn headers(&mut self) -> Result<&StringRecord>;
Так что headers()
изменчиво заимствует экземпляр ReaderBuilder
.
То же самое для records()
:
fn records(&mut self) -> StringRecordsIter<R>;
Оба возвращаемых типа этих функций содержат изменяемые ссылки на базовый экземпляр ReaderBuilder
.
Согласно правилам заимствования ржавчины , у вас не может быть нескольких изменяемых ссылок на один и тот же объект, живущий в то же время .
Возможные меры смягчения : Используйте headers()
в отдельной области. Таким образом, ссылки отбрасываются до вызова records()
.
let mut rdr = csv::ReaderBuilder::new()
.has_headers(true)
.from_reader(file);
{
let headers = rdr.headers().unwrap();
println!("{:?}", headers);
// `headers` is dropped here.
}
for result in rdr.records() {
let record = result.unwrap();
println!("{:?}", record);
}
Ошибка не возникает при clone
, поскольку при клонировании создается и размещается другой новый объект. У вас больше нет нескольких изменяемых ссылок.
То же самое, когда вы используете println!("{:?}", rdr.headers().unwrap());
, значение, возвращаемое headers()
, немедленно удаляется, поэтому средство проверки заимствования не жалуется на множественные изменяемые ссылки.
Независимо от того, предоставляются ли функции библиотекой или созданы пользователем, не имеет значения. Единственное, что имеет значение, это подписи функций.