Назначить одно значение для нескольких переменных в одной строке в Rust?

Распространенный способ присвоения нескольких переменных часто выражается в таких языках программирования, как C или Python:

a = b = c = value;

Есть ли что-то подобное в Rust, или вам нужно это записать?

a = value;
b = value;
c = value;

Извиняюсь, если это очевидно, но все мои поиски приводят к вопросам и ответам относительно назначения кортежей.

5 ответов

Решение

Нет, аналога нет. Да, вы должны написать несколько назначений или написать макрос, который сам выполняет несколько назначений.

Как ДК. правильно ответив, вы не можете связать результат заданий вместе. Однако вы можете назначить несколько переменных с помощью одного оператора.

В операторе вы можете связать несколько имен, используя неопровержимый шаблон в левой части присвоения:

      let (a, b) = 1, 2;

Вы можете использовать шаблон среза как левую часть присваивания и выражение массива с правой стороны, чтобы повторить значение, если оно реализует Copy:

      let value = 42;
let [a, b, c] = [value; 3]; // or: let [mut a, mut b, mut c] = ...
println!("{} {} {}", a, b, c);

(Детская площадка )

В настоящее время вы не можете назначать несколько переменных в не- letвыражение присваивания, но оно реализуется (см. RFC 2909) и может быть стабилизировано в ближайшем будущем.

На самом деле, вы вполне можете это сделать!

      let a @ b @ c = value;

Это использует @синтаксис в шаблонах, который используется для привязки значения к переменной, но сохраняет соответствие шаблону. Таким образом, это связывается с a(копированием), а затем продолжает соответствовать шаблону b @ c, который связывает valueк b, и так далее.

Но, пожалуйста, не надо. Это сбивает с толку и практически бесполезно по сравнению с написанием нескольких операторов.

Использование константных дженериков :

      fn main() {
    let [a, b, c] = fill_new_slice(1);
    dbg!(a, b, c);
}

fn fill_new_slice<T: Copy, const N: usize>(value: T) -> [T; N] {
    [value; N]
}
      $ cargo run --quiet
[src/main.rs:3] a = 1
[src/main.rs:3] b = 1
[src/main.rs:3] c = 1

В Rust выражение a = b = c = value; то же самое a = (b = (c = value));

И (x = ...) возвращается (). Тогда первое выражение эквивалентно следующему:

      c = value;
b = ();
a = ();

Обратите внимание, что выражение имеет точку с запятой в конце, но если выражение было в последней строке в качестве возврата функции, как это a = b = c = value, эквивалент будет следующим:

      c = value;
b = ();
a = () // without the semicolon
Другие вопросы по тегам