因此,我try 为没有堆分配的no_std环境实现一个简单的队列,如下所示:

pub struct Queue<T: Sized, const SIZE: usize> {
    pub data: [Option<T>; SIZE],
}

impl<T: Sized, const SIZE: usize> Queue<T, SIZE> {
    pub const fn new() -> Queue<T, SIZE> {
        const DEFAULT: Option<T> = None;
        Queue {
            data: [DEFAULT; SIZE],
        }
    }
}

在我看来,这应该是可能的,因为T是有大小的,None值可以是const,所以它可以被复制,而不需要T实现Copy特征. 然而,我似乎想不出该怎么做. 上面的语法给出了一个错误,其中包含一个非常无用的提示,建议我将T替换为T:

error[E0401]: can't use generic parameters from outer function
  --> src/queue.rs:11:31
   |
9  | impl<T: Sized, const SIZE: usize> Queue<T, SIZE> {
   |      - type parameter from outer function
10 |     pub const fn new() -> Queue<T, SIZE> {
11 |         const DEFAULT: Option<T> = Default::default();
   |                      -        ^ use of generic parameter from outer function
   |                      |
   |                      help: try using a local generic parameter instead: `<T>`

有什么办法可以做到这一点吗?顺便说一下,我用的是2021年版的铁 rust .

推荐答案

允许类型的关联常量使用其参数,因此编译如下:

pub struct Queue<T: Sized, const SIZE: usize> {
    pub data: [Option<T>; SIZE],
}

impl<T: Sized, const SIZE: usize> Queue<T, SIZE> {
    const NONE_T: Option<T> = None;

    pub const fn new() -> Queue<T, SIZE> {
        Queue {
            data: [Self::NONE_T; SIZE],
        }
    }
}

(Playground)

遗憾的是,常量不能位于函数内部,但它至少可以是私有的.

Rust相关问答推荐

在Tauri中获取ICoreWebView 2_7以打印PDF

trait声明中的生命周期参数

Box::new()会从一个堆栈复制到另一个堆吗?

在铁 rust 中传递所有权

如何正确重新排列代码以绕过铁 rust 借入判断器?

如何实现Serde::Ser::Error的调试

在macro_rule中拆分模块和函数名

borrow 是由于对 `std::sync::Mutex>` 的解引用强制而发生的

try 实现线程安全的缓存

仅在使用 &mut 或线程时borrow 的数据在闭包之外转义?

从Rust 的临时文件中创建引用是什么意思?

没有明确地说return会产生错误:match arms have incompatible types

Rust/Serde/HTTP:序列化`Option`

在 Rust 中,为什么整数溢出有时会导致编译错误或运行时错误?

为什么 i32 Box 类型可以在 Rust 中向下转换?

在 FFI 的上下文中,未初始化是什么意思?

如何获取包裹在 Arc<> 和 RwLock<> 中的 Rust HashMap<> 的长度?

通用类型,不同于输入类型,作为函数的返回值

在使用大型表达式时(8k 行需要一小时编译),是否可以避免 Rust 中的二次编译时间?

如何迭代调用可能会失败的函数?操作员?