使用常量表达式为其大小声明数组

rra*_*val 7 arrays rust rust-obsolete

我在数组周围有一个newtype包装器.我假设我可以使用size_of而不是手动传递数组的大小,但编译器认为我错了.

use std::mem::{size_of, size_of_val};

#[repr(C, packed)]
struct BluetoothAddress([u8, ..6]);

fn main() {
    const SIZE: uint = size_of::<BluetoothAddress>();

    let bytes = [0u8, ..SIZE];
    println!("{} bytes", size_of_val(&bytes));
}
Run Code Online (Sandbox Code Playgroud)

(围栏链接)

我每晚都在使用:rustc 0.13.0-nightly(7e43f419c 2014-11-15 13:22:24 +0000)

此代码失败,并显示以下错误:

broken.rs:9:25: 9:29 error: expected constant integer for repeat count, found variable
broken.rs:9     let bytes = [0u8, ..SIZE];
                                    ^~~~
error: aborting due to previous error
Run Code Online (Sandbox Code Playgroud)

数组表达式Rust参考使我认为这应该工作:

[expr ',' ".." expr]表单中,后面的表达式".."必须是可以在编译时计算的常量表达式,例如文字或静态项.

Chr*_*gan 6

你的SIZE定义不合法; 只是它中的错误发生的时间晚于数组结构上的错误.如果您更改[0u8, ..SIZE][0u8, ..6]只是为了使该部分有效,您会发现SIZE声明存在问题:

<anon>:7:24: 7:53 error: function calls in constants are limited to struct and enum constructors [E0015]
<anon>:7     const SIZE: uint = size_of::<BluetoothAddress>();
                                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
<anon>:7:24: 7:51 error: paths in constants may only refer to items without type parameters [E0013]
<anon>:7     const SIZE: uint = size_of::<BluetoothAddress>();
                                ^~~~~~~~~~~~~~~~~~~~~~~~~~~
Run Code Online (Sandbox Code Playgroud)

你现在根本就不能这样打电话size_of.

另一种方法是反转事物,这SIZE是规范定义,其他地方使用它:

use std::mem::{size_of, size_of_val};

const SIZE: uint = 6;

#[repr(C, packed)]
struct BluetoothAddress([u8, ..SIZE]);

fn main() {
    let bytes = [0u8, ..SIZE];
    println!("{} bytes", size_of_val(&bytes));
}
Run Code Online (Sandbox Code Playgroud)

更新:使用Rust 1.0,此问题已被有效废弃,并且编译器错误消息已得到改进,因此它们更加清晰.

此外,随着#42859最近登陆,每晚rustc将允许size_of在恒定的环境中使用,只要箱子有#![feature(const_fn)](并且当#43017降落时,也不再需要它,然后它将过滤到稳定).

换句话说,语言的改进使这不再是一个问题.