我在数组周围有一个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));
}
我每晚使用: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
Rust Reference on Array Expressions让我觉得这应该有效:
在
[expr ',' ".." expr]
形式中,".."
之后的表达式必须是可以在编译时计算的常量表达式,例如文字或静态项。
答案 0 :(得分: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>();
^~~~~~~~~~~~~~~~~~~~~~~~~~~
目前你根本无法像这样呼叫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));
}
更新:在Rust 1.0中,这个问题已被有效废弃,编译器错误消息已得到改进,因此它们更加清晰。
此外,在#42859最近降落的情况下,每晚生锈只允许size_of
在一个恒定的上下文中使用,只要箱子有#![feature(const_fn)]
(当#43017落地时,就赢了不再需要,然后它将过滤到稳定)。
换句话说,语言的改进使这不再是一个问题。