Занимать проверку и аргументы функции в Rust, правильно или более усердно?
Когда изменяемый аргумент передается в качестве аргумента функции, средство проверки заимствования не позволяет использовать его для создания других аргументов, даже когда эти аргументы клонируют значения без ссылки.
Хотя присваивание переменных за пределами функции всегда является опцией1, логически это кажется чрезмерным и что-то, что контролер заимствований мог бы принять во внимание.
Это работает как задумано или что-то должно быть решено?
#[derive(Debug)]
struct SomeTest {
pub some_value: f64,
pub some_other: i64,
}
fn some_fn(var: &mut SomeTest, other: i64) {
println!("{:?}, {}", var, other);
}
fn main() {
let mut v = SomeTest { some_value: 1.0, some_other: 2 };
some_fn(&mut v, v.some_other + 1);
// However this works!
/*
{
let x = v.some_other + 1;
some_fn(&mut v, x);
}
*/
}
Выдает эту ошибку:
--> src/main.rs:14:21
|
14 | some_fn(&mut v, v.some_other + 1);
| - ^^^^^^^^^^^^ use of borrowed `v`
| |
| borrow of `v` occurs here
Смотрите: манеж.
[1]: Несмотря на то, что одноразовые назначения иногда улучшают читабельность, необходимость использования их в качестве аргументов поощряет использование областей, чтобы избежать одноразовых переменных, загрязняющих пространство имен, вызывая вызовы функций, которые в противном случае были бы одной строкой - заключенные в фигурные скобки и определяющие переменные... Я хотел бы избежать этого, если это возможно, особенно когда требование кажется чем-то, что может поддерживать средство проверки заимствования.
1 ответ
Это артефакт текущей реализации средства проверки заимствований. Это хорошо известное ограничение, появившееся как минимум в 2013 году, и оно никого не обрадовало.
Это работает как задумано
Да.
что-то, что должно быть решено?
Да.
Волшебные ключевые слова - "нелексические времена жизни". Прямо сейчас, времена жизни лексические - они соответствуют блокам источника, которые мы печатаем. В идеале, foo.method(foo.mutable_method())
Было бы видно, что заем заканчивается "в скобках", но по множеству причин он связан со всем утверждением.
Для получения дополнительной информации см. RFC Issue 811 и все, что связано с этим.