【问题标题】:Assign a single value to multiple variables in one line in Rust?在 Rust 的一行中为多个变量分配一个值?
【发布时间】:2016-12-13 03:39:30
【问题描述】:

分配多个变量的常用方法在 C 或 Python 等编程语言中通常表示为:

a = b = c = value;

Rust 中是否有等价物,还是需要写出来?

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

抱歉,如果这很明显,但我所有的搜索都会导致关于元组分配的问答。

【问题讨论】:

  • 我不相信有。

标签: rust syntactic-sugar


【解决方案1】:

不,没有等价物。是的,你必须写多个赋值,或者写一个宏,它自己做多个赋值。

【讨论】:

  • 这一决定背后的部分原因是所有权; a = b = c = Vec::new() 的结果是什么?
  • 对于按值复制的类型,它可以工作,但是,我明白为什么它不适合 rust。
【解决方案2】:

作为 DK。正确回答,您不能将分配的结果链接在一起。但是,您可以使用单个语句分配多个变量。

let statement 中,您可以使用赋值左侧的irrefutable pattern 绑定多个名称:

let (a, b) = 1, 2;

如果它实现了 Copy,您可以使用 slice pattern 作为赋值的左侧,并在右侧使用 array expression 来重复值:

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

(Playground)

您目前无法在非let 赋值表达式中分配多个变量,但这正在实施(请参阅RFC 2909)并且可能会在不久的将来稳定。

【讨论】:

    【解决方案3】:

    使用const generics

    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
    

    【讨论】:

      【解决方案4】:

      在 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
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-23
      • 1970-01-01
      • 2013-01-19
      • 1970-01-01
      • 2023-01-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多