Следующий код Rust успешно компилируется:
struct StructNothing;
impl<'a> StructNothing {
fn nothing(&'a mut self) -> () {}
fn twice_nothing(&'a mut self) -> () {
self.nothing();
self.nothing();
}
}
Однако, если мы попытаемся упаковать его в черту, он потерпит неудачу:
pub trait TraitNothing<'a> {
fn nothing(&'a mut self) -> () {}
fn twice_nothing(&'a mut self) -> () {
self.nothing();
self.nothing();
}
}
Это дает нам:
error[E0499]: cannot borrow '*self' as mutable more than once at a time
--> src/lib.rs:6:9
|
1 | pub trait TraitNothing<'a> {
| -- lifetime ''a' defined here
...
5 | self.nothing();
| --------------
| |
| first mutable borrow occurs here
| argument requires that '*self' is borrowed for ''a'
6 | self.nothing();
| ^^^^ second mutable borrow occurs here
- Почему разрешена первая версия, а вторая запрещена?
- Есть ли способ убедить компилятор, что вторая версия в порядке?
Фон и мотивация
Такие библиотеки, как rust-csv
хотели бы поддерживать потоковый анализ и анализ с нулевым копированием, потому что это в 25-50 раз быстрее, чем выделение памяти (согласно тестам). Но встроенная черта Rust Iterator
не может быть использована для этого, потому что нет способа реализовать collect()
. Цель состоит в том, чтобы определить признак StreamingIterator
который может использоваться совместно с rust-csv
и несколькими подобными библиотеками, но каждая попытка реализовать его до сих пор сталкивалась с проблемой, описанной выше.