rust - Rust 常量表达式可以使用 Default 之类的特征吗?
问题描述
此代码给出错误:
#[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);
有没有办法避免这样做?
解决方案
..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()
};
推荐阅读
- angular - Angular 自动完成功能似乎无法正常工作
- python - 在 django 中启动 celery task_monitor
- python - 如何停止/终止运行 python 脚本?(再次)
- python - Python:将大型数据框(1.2M 行)插入 Postgres 的问题
- java - 2.1.6 Spring Boot - Elasticsearch Healthcheck 失败
- angular - 使用 mqtt-ngx 通过 websocket 在 tls 中连接到代理
- r - 与微软团队的 slackr_upload 等效的 R 函数
- sql - 数字格式 SQL INSERT
- c# - 如果 5 分钟内没有记录任何内容,如何使进程崩溃
- perl - perl 哈希打印键的值