Почему значение не перемещается с опцией unwrap? - PullRequest
1 голос
/ 16 октября 2019

Новый ржаветь здесь и пытается учиться. Рассмотрим следующий фрагмент кода:

let x = Some("air");
println!("{}", x.unwrap());
println!("{}", x.unwrap());

Почему это работает? Поскольку метод unwrap имеет следующую сигнатуру pub fn unwrap(self) -> T, поэтому он должен переместиться self в метод, что означает, что после первого вызова x.unwrap я больше не смогу получить доступ к x. Однако это все еще работает? Может кто-нибудь объяснить, какое недоразумение я здесь воспринимаю?

Ответы [ 3 ]

4 голосов
/ 16 октября 2019

Вы путаете &str с String, что, скорее, не Copy.

fn main() {
    // This will work fine.
    let x = Some("data");
    println!("{:?}", x.unwrap());
    println!("{:?}", x.unwrap());

    // however, this will generate an error since value will be moved.
    let x = Some("data".to_string());
    println!("{:?}", x.unwrap());
    println!("{:?}", x.unwrap());
}
2 голосов
/ 16 октября 2019

Только что понял, x в OP не перемещается, потому что Option<&str> реализует черту Copy. С другой стороны, если внутренний тип в опции является более сложным типом, например, struct, это не будет работать:

struct Node<T> { elem: T }

let y = Some(Node { elem: 3});

println!("{}", y.unwrap().elem);
println!("{}", y.unwrap().elem);

выдаст следующую ошибку:

Line 33, Char 24: use of moved value: `y` (solution.rs)
   |
32 |         println!("{}", y.unwrap().elem);
   |                        - value moved here
33 |         println!("{}", y.unwrap().elem);
   |                        ^ value used here after move
   |
0 голосов
/ 16 октября 2019

Метод unwrap() используется для удаления родительского элемента из выбранного элемента, а не самого элемента.

Допустим, Y является родительским для «X», а «Z» является родительским для «Y», тогда, когда вы говорите, x.unwrap() родительский «X» X удаляется, а «Z» становится родительским для «X 'и теперь, когда вы говорите x.unwrap() снова, тогда' Z 'удаляется.

...