Rust常量表达式可以使用Default这样的特征吗?

问题描述 投票:1回答:1

这个代码给出了一个错误。

#[derive(Default)]
struct A {
    b: Option<()>,
    c: Option<()>,
}

const a: A = A {
    b: None,
    ..Default::default()
};
error[E0015]: calls in constants are limited to constant functions, tuple structs and tuple variants
 --> src/lib.rs:9:7
  |
9 |     ..Default::default()
  |       ^^^^^^^^^^^^^^^^^^

在这个小例子中,这不是一个大问题,但是如果我有一个由多个结构组成的结构,这些结构实现了 Default 特质,不能使用它至少成为一种不便。

虽然我可以写这个,但它不会有以下的灵活性 Default 提供。

impl A {
    const fn new(b: Option<()>) -> Self {
        A { b, c: None }
    }
}

const a: A = A::new(None);

有什么办法可以避免这样做吗?

rust const default
1个回答
4
投票

不,不可能在常量上下文中使用traits。这个问题还在讨论中。RFC #2632 - 调用const fns的通用参数的方法.

另请参阅:


3
投票

在Rust中,我可以使用const和重载操作符吗?..Default::default() 语法不限于 Default::default(),所以你可以写一个 const fn 默认的类似函数,并在一个常量里面使用。

struct A {
    b: Option<()>,
    c: Option<()>,
}

impl A {
    const fn new() -> A {
        A {
            b: None,
            c: None,
        }
    }
}

impl Default for A {
    fn default() -> A {
        // implementing using new() instead of #[derive]
        // to avoid diverging implementations
        A::new()
    }
}

const a: A = A {
    b: None,
    ..A::new()
};

Run in Playground

© www.soinside.com 2019 - 2024. All rights reserved.