struct - 如何声明一个结构,其中只有一些成员可以使用另一个结构的值?

标签 struct rust default-value

Rust 有一个有用的特性,您可以使用现有的结构并且只覆盖它的一些成员。例如,以下结构的值

struct SomeTool {
    pub unique_id: String,
    pub poll: Option<fn(&Context) -> bool>,
    pub exec: Option<fn(&mut Context) -> ToolResult>,
    pub modal: Option<fn(&mut Context) -> ToolResult>,
    pub ui: Option<fn(&mut UIPanel)>,
}

可以通过传入一个结构实例来初始化(例如SomeTool::default()):

new_tool = SomeTool {
    unique_id: "tool.foobar".to_string(),
    exec: Some(foobar_exec)
    .. SomeTool::default()
};

我希望能够声明 SomeTool 而不必明确列出每个回调(将来添加新的回调可能会导致在整个代码库中添加许多 None ).

这很好用,但现在我可能不小心遗漏了 unique_id 进行其他一些初始化,它会使用 default 中的任何内容。

有没有一种方法可以描述可以覆盖某些成员但不能覆盖其他成员的结构?


请注意,现实世界的用例比这有更多的成员(使发生事故的可能性更高),只是针对问题进行了简化。

最佳答案

因为您的 unique_id 应该是唯一的,所以它不应该有 Default 构造函数。但是,如果您从假设的 UniqueId 类型中删除 Default impl,那么您将无法为 SomeTool< 派生 Default/.

当前有效的解决方案是将所有不需要值的字段移动到子结构,并且不为 SomeTool 实现 Default。因此,您可以按如下方式使用 SomeTool:

new_tool = SomeTool {
    unique_id: "tool.foobar".to_string(),
    callbacks: Callbacks {
        exec: Some(foobar_exec),
        .. Callbacks::default()
    }
};

Rust 在未来可能会获得一个假设的特性,它允许你有两个具有相同字段的结构作为结构表达式中的基础表达式。该功能将允许您使用子结构来初始化子结构和 SomeTool 共有的所有字段,但仅此而已。

关于struct - 如何声明一个结构,其中只有一些成员可以使用另一个结构的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41094315/

相关文章:

c++ - 使用节点 C++ 创建链表

arrays - 使用 Golang 重构 Json

rust - 如何在 ARM 嵌入式 Rust 中使用更少的内存进行取模

python - 可选关键字参数的命名元组和默认值

c# - DefaultValue 属性不适用于我的自动属性

c# - 在 C# 中,本地结构实例和成员结构实例有什么不同?

c - 结构和警告 C

rust - 函数声明中更具体的 self

rust - 如何执行简单的 while 循环并使用 nom 解析二进制数据 block ?

c# - OptionalAttribute 参数的默认值?