openlang

Почему этот кортеж перемещает свою строку?

let message = String::from("hello");

let pair = (message, message.len());

// не понимаю переход владения между одинаковыми переменными то есть исходным message и message в кортеже если все message одинаковые ,как это работает???

Переведено с английскогоПоказать оригинал

Разговор продолжается 2

Следуя доводам
  1. Ссылка на ответ

    Когда существующую переменную кладут в кортеж, владение ею передаётся кортежу. В некоторых случаях важен и порядок этих действий, и ваш пример как раз из таких. Ваш код не скомпилируется, поскольку кортеж забирает значение раньше повторного обращения к нему (вызов message.len() происходит уже после перемещения). Но если написать вот так:

    let message = String::from("hello");
    
    let pair = (message.len(), message);

    то компиляция пройдёт, потому что message.len() выполняется до передачи владения кортежу.

    Ещё советую прочитать главу о владении в книге Rust (https://doc.rust-lang.org/book/ch04-01-what-is-ownership.html), это должно прояснить ситуацию.

    Переведено с английскогоПоказать оригинал

Другие стороны того же вопроса

  1. Один и тот же вызов с sink, сначала копия, потом перенос

    Nim 2 решает, копировать или переносить, в каждой точке вызова. Не на уровне proc. Тот же аргумент, та же proc. Первый вызов…

    Ответы 2Последняя активность nim
  2. Отложить изменяемое заимствование блока очистки до его исполнения

    Как написать в Rust устойчивую к панике конструкцию, похожую на Java try { ... } finally { ... }, чтобы блоки try и finally м…

    Ответы 2Последняя активность rust
  3. Ввод массивов символов через указатели

    Когда пытаюсь вводить с клавиатуры данные в массивы char, программа каждый раз падает. Как можно удобно считывать с клавиатур…

    Ответы 2Последняя активность c