【问题标题】:Can array lengths be inferred in Rust?可以在 Rust 中推断数组长度吗?
【发布时间】:2020-01-25 09:51:54
【问题描述】:

我可以这样做:

let a: [f32; 3] = [0.0, 1.0, 2.0];

但是为什么这不起作用呢?

let a: [f32; _] = [0.0, 1.0, 2.0];

在我看来,长度是多余的,而且推断起来微不足道。有没有办法避免必须明确指定它? (并且不必将 f32 附加到所有文字。)

【问题讨论】:

    标签: rust


    【解决方案1】:

    _ 只能在两种情况下使用:在模式中,匹配要忽略的值,以及作为类型的占位符。在数组类型中,长度不是类型,而是表达式,表达式中不能使用_

    但是,您可以做的是将f32 仅附加到其中一个文字并完全省略类型。由于数组的所有项都必须具有相同的类型,因此编译器会为数组推断出正确的元素类型。

    let a = [0.0f32, 1.0, 2.0];
    

    【讨论】:

    • 如果您正在处理常量或静态变量(并且您必须指定类型),通常使用切片类型来代替:static FOO: &[f32] = &[3.0, ...];
    • 那么您可以使用const,除非您需要将切片本身放在静态内存中(即,如果您需要&'static &[f32])。
    【解决方案2】:

    从 1.39 开始,可以使用简单的宏

    macro_rules! arr {
        ($id: ident $name: ident: [$ty: ty; _] = $value: expr) => {
            $id $name: [$ty; $value.len()] = $value;
        }
    }
    

    用法

    arr!(static BYTES: [u8; _] = *b"foo");
    arr!(let floats: [f32; _] = [0., 1.]);
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-23
    • 1970-01-01
    • 2012-01-04
    • 2022-09-28
    • 1970-01-01
    • 2016-05-31
    • 2013-10-12
    相关资源
    最近更新 更多