Я играю с новыми закрытиями в Rust, и я столкнулся с ситуацией, которая снова показала мне, что я еще не полностью понял правила владения.Правила владения ржавчинами в контексте закрытий
#![feature(unboxed_closures)]
#![feature(overloaded_calls)]
fn main() {
let mut test = 5i;
let do_something = ref |:| { println!("{}", test) };
test = 6i;
do_something();
println!("{}", test);
}
Этот код не говорил мне, что назначение test = 6i;
является недействительным, поскольку test
уже заимствованы к do_something
закрытия.
Но читать правила владения (из Руководства Rust), кажется, действует мне:
1.You управления, когда этот ресурс освобождаться.
2. Вы можете предоставить этот ресурс неизменно многим заемщикам, как вам хотелось бы.
3. Вы можете предоставить этот ресурс, возможно, одному заемщику. НО
4. Когда вы это сделаете, вы также не можете одолжить его иначе, изменчиво или неизменно.
5.Вы не можете с легкостью одолжить его, если вы в настоящее время предоставляете его кому-то.
В чем проблема с кодом выше. test
является владельцем и do_something
должен иметь только непреложный ссылка. Не следует ли изменять значение test
, если единственная ссылка на него, которую мы предоставляем кому-то, была неизменяемая?
РАЗВЕЙТЕ
Теперь, когда я узнал, что доступ владельца также считается кредитованием я изменил код, чтобы использовать Cell
.
#![feature(unboxed_closures)]
#![feature(overloaded_calls)]
use std::cell::Cell;
fn main() {
let test = Cell::new(5i);
let do_something = ref |:| { println!("{}", test) };
test.set(6i);
do_something();
println!("{}", test);
}
Но интересно, почему это печатает
5
6
и не
6
6
Как бы мне нужно изменить код, чтобы напечатать это?
6
6
Почему вы писали '|: |' вместо '||'? Я не знаю точно, почему, но, похоже, это имеет значение, в котором вы ищете. – Levans
А вы пишете. '||' по-прежнему являются старыми закрытиями, поскольку '|: |' является одним из новых, и я думал, что 'ref |: |' должен быть новым типом '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' Мне, наверное, нужно копать глубже :) – Christoph