在Rust中,这起作用:

fn main() {
    let a = [0; 32];
    println!("{:?}", a);
}

但事实并非如此:

fn main() {
    let a = [0; 33];
    println!("{:?}", a);
}

编译错误:

error[E0277]: the trait bound `[{integer}; 33]: std::fmt::Debug` is not satisfied
 --> src/main.rs:3:22
  |
3 |     println!("{:?}", a);
  |                      ^ the trait `std::fmt::Debug` is not implemented for `[{integer}; 33]`
  |
  = note: `[{integer}; 33]` cannot be formatted using `:?`; if it is defined in your crate, add `#[derive(Debug)]` or manually implement it
  = note: required by `std::fmt::Debug::fmt`

我假设std::fmt::Debug函数以某种方式检测长度不超过32个元素的类型,但随后放弃检测.或者为什么不起作用?

推荐答案

Starting with Rust 1.47 (2020-10-08), 100!几乎所有的特征现在都适用于任意长度的array.所以you can now print arrays of length 33

下面是旧答案供参考.


遗憾的是,Rust还不支持整数作为通用参数.因此, for each 数组[T; N]实现一个特征(比如Debug)并不容易.目前,标准库使用一个宏来轻松实现长达32个字符的trait.

要输出数组,可以通过以下方式轻松将其转换为切片(&[T]):

let a = [0; 33];
println!("{:?}", &a[..]);

顺便说一句:通常,只需在数组中加上&的前缀,就可以从数组中获得一个切片,但println个参数的工作方式有点不同,因此需要添加完整范围的索引[..].


future 情况可能会有所改善.RFC 2000: Const Generics已经被接受,并且大部分在编译器中实现.它将允许整个数组长度上有impl个通用块.您可以在the corresponding tracking issue上跟踪实施和稳定状态.

Rust相关问答推荐

无需通过ASIO输入音频,并使用cpal进行反馈示例

是否可以为`T:Copy`执行`T. clone`的测试

什么时候铁 rust FFI边界上的panic 是未定义的行为?

交换引用时的生命周期

零拷贝按步骤引用一段字节

你能在Rust中弃用一个属性吗?

找不到 .has_func 或 .get_func 的 def

Rust:为什么 &str 不使用 Into

为什么某些类型参数仅在特征边界中使用的代码在没有 PhantomData 的情况下进行编译?

Rust 文件未编译到 dll 中

将多维数组转换为切片

(let b = MyBox(5 as *const u8); &b; ) 和 (let b = &MyBox(5 as *const u8); ) 之间有什么区别

从 Axum IntoResponse 获取请求标头

`移动||异步移动{...}`,如何知道哪个移动正在移动哪个?

Rust 中 `Option` 的内存开销不是常量

如果我不想运行析构函数,如何移出具有析构函数的 struct ?

以下打印数组每个元素的 Rust 代码有什么问题?

为什么-x试图解析为文字并在声明性宏中失败?

为什么这里需要类型注解?

有没有比多个 push_str() 调用更好的方法将字符串链接在一起?