2016-12-12 71 views
8

Rust ma przydatną funkcję, w której można użyć istniejącej struktury i zastąpić tylko niektórych jej członków. Na przykład, z następujących wartości strukturyJak zadeklarować strukturę, w której tylko niektórzy członkowie mogą używać wartości z innej struktury?

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)>, 
} 

może być inicjowane przez przejście na przykład na strukturę (np SomeTool::default())

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

że chcą mieć możliwość uznania SomeTool bez jawnie wymienić każde wywołanie zwrotne (dodanie nowych wywołań zwrotnych w przyszłości może doprowadzić do wielu dodatków None w całym kodzie źródłowym).

To działa dobrze, ale teraz mogłem przypadkowo pominąć unique_id dla innej inicjalizacji i używałbym tego, co jest w default.

Czy istnieje sposób na opisanie struktury, która może mieć niektórych członków zastąpione, ale nie inni?


Należy pamiętać, że rzeczywisty przypadek użycia ma więcej członków niż ten (zwiększając prawdopodobieństwo wypadków), po prostu uproszczony dla pytania.

Odpowiedz

8

Ponieważ Twój unique_id ma być unikalny, nie powinien mieć konstruktora Default. Ale jeśli usuniesz implikację Default imp z hipotetycznego typu UniqueId, nie będzie można uzyskać Default dla SomeTool.

Obecnie działającym rozwiązaniem jest przeniesienie wszystkich pól, które nie wymagają wartości do pod-struktury, a nie wdrożenie Default dla SomeTool. Tak więc chcesz mieć możliwość korzystania z SomeTool następująco:

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

Jest hipotetyczny funkcja Rust może się w przyszłości, co pozwala mieć dwa konstrukcjom z tych samych dziedzinach, aby być wyrazem zasady w wyrażenie strukturalne. Ta funkcja pozwala na użycie pod-struktury do zainicjowania wszystkich pól wspólnych podrzędnie i SomeTool, ale nie więcej.