2016-12-12 79 views
8

Rust有一個有用的功能,您可以使用現有的結構並僅覆蓋其某些成員。如何聲明一個結構,其中只有一些成員可以使用另一個結構中的值?

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

我希望能夠宣佈SomeTool,而不必明確列出:例如,下面的結構

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())來初始化每個回調(在未來添加新的回調可能會導致在代碼庫中添加很多None)。

這很好,但現在我可能會意外地忽略unique_id進行其他一些初始化操作,它會使用default中的任何內容。

有沒有辦法來描述一個結構,可以有一些成員覆蓋而不是其他人?


請注意,真實世界的用例比此更多的成員(使事故發生的機率更高),只是簡化了這個問題。

回答

8

由於您的unique_id應該是唯一的,因此它不應具有Default構造函數。但是,如果您從假設的UniqueId類型中刪除Default impl,那麼將無法爲SomeTool推導Default

當前正在運行的解決方案是將所有不需要值的字段移動到子結構,而不是實現DefaultSomeTool。因此,你可以使用SomeTool如下:

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

有一個假設的功能,鏽病可能在未來,它可以讓你有兩個結構與同領域處於基本表達式得到結構表達式。該功能將允許您使用子結構來初始化子結構和SomeTool有共同但不是更多的所有字段。

相關問題