如何声明一个结构体,其中只有部分成员可以使用另一个结构体的值?

8
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中的任何内容。
是否有一种描述结构体的方法,使其可以覆盖某些成员但不覆盖其他成员?
请注意,实际用例比这更具有成员(增加了事故的机会),只是为了提问而简化。
1个回答

8
由于您的“unique_id”应该是唯一的,所以它不应该有一个“Default”构造函数。但是如果从假设的“UniqueId”类型中删除“Default”实现,则将无法为“SomeTool”派生“Default”。
目前的解决方案是将不需要值的所有字段移动到子结构中,并且不为“SomeTool”实现“Default”。因此,您可以按以下方式使用“SomeTool”:
new_tool = SomeTool {
    unique_id: "tool.foobar".to_string(),
    callbacks: Callbacks {
        exec: Some(foobar_exec),
        .. Callbacks::default()
    }
};

未来,Rust 可能会推出一项假设性功能,允许您在结构体表达式中将具有相同字段的两个结构体作为基础表达式。该功能将允许您使用子结构体初始化子结构体和 SomeTool 共有的所有字段,但不包括更多。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接