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/