2017-10-27 4 views
0

Ich habe diesen Code in einem Beispielcode gefunden. Es funktioniert gut, aber ich habe einen Linter Fehler, der besagt, dass es als eine if-let-Anweisung strukturiert sein sollte.Wie lautet die Syntax für eine if-let-Anweisung?

match event { 
    glutin::Event::WindowEvent { event, .. } => match event { 
     glutin::WindowEvent::Closed => return glutin::ControlFlow::Break, 
     glutin::WindowEvent::Resized(w, h) => gl_window.resize(w, h), 
     _ =>(), 
    }, 
    _ =>() 
} 

Dies war mein Versuch, sie zu restrukturieren:

if let _ = glutin::Event::WindowEvent { event, .. } { 
    match event { 
     glutin::WindowEvent::Closed => return glutin::ControlFlow::Break, 
     glutin::WindowEvent::Resized(w, h) => gl_window.resize(w, h), 
     _ =>(), 
    } 
} 

Hoppla, das ist ein Syntaxfehler. Was wäre der richtige Weg, um die Warnmeldung zu löschen?

Nachdem ich den Code genauer betrachtet hatte, erkannte ich, dass ich die Syntax nicht verstehe. glutin::Event::WindowEvent { event, .. } sieht aus wie die Syntax zum Erstellen einer neuen Instanz von WindowEvent, aber wie kann das in einer Match-Anweisung erlaubt sein?

Auch, was bedeutet die ..? Ich kenne ..Default::default(), aber nicht den doppelten Punkt an sich.

+0

Es ist umgekehrt: 'Wenn Glutin lassen :: Ereignis :: Window {event, ..} = Ereignis {...}' –

+0

Thanks @ E_net4! Eine Antwort, die die Syntax erklärt, wird sehr geschätzt. – BonsaiOak

+0

[** Eine ** Frage per Post, bitte] (https://meta.stackexchange.com/q/39223/281829). – Shepmaster

Antwort

2

Die Syntax, die Ihnen entgeht, heißt destructuring.

Dieses Muster ermöglicht die Zuordnung bestimmter Felder in einer Struktur, Enumeration oder Tupel. Sie können daher nicht einfach verwenden, wenn Sie mit der Destrukturierung auf der rechten Seite der Bindung lassen.

Der Code, den Sie wollen, ist wahrscheinlich:

if let glutin::Event::WindowEvent { event, .. } = event { 
    match event { 
     glutin::WindowEvent::Closed => return glutin::ControlFlow::Break, 
     glutin::WindowEvent::Resized(w, h) => gl_window.resize(w, h), 
     _ =>(), 
    } 
} 

Es gibt eine mögliche Verwechslung zwischen der rechten Hand event Größe und der eine aus dem Muster extrahiert. Die Verwendung von event in der Destrukturierung wird verpflichtend gemacht, da sie struct-Felder nach Namen verwenden muss.

+0

Danke, das ist genau das, was ich gesucht habe! Ich habe versucht nach 'Rost lang .. Syntax' zu suchen, aber es ist nicht viel aufgetaucht. – BonsaiOak

+0

Nach dem 'match' Ausdruck sollte kein Komma stehen. – BonsaiOak

2

zitierte direkt aus The Book, second edition:

Die if let Syntax können Sie if und let in eine weniger ausführliche Art und Weise kombinieren Werte zu behandeln, die ein Muster entsprechen und den Rest ignorieren.

Es bietet auch dieses Beispiel:

if let Some(3) = some_u8_value { 
    println!("three"); 
} 

Die korrekte Syntax ist if let «pattern» = «expression» { ... }, und nicht das Gegenteil in der Frage geschrieben.

if let glutin::Event::WindowEvent { event, .. } = event { 
    // ... 
} 
Verwandte Themen