2016-12-29 2 views

Antwort

4

ich dachte, dass es etwas auf Option oder Result

wäre aber keiner von diesen Typen hier erscheinen. Subtrahieren zwei Zahlen ergibt eine andere Zahl.

Es scheint, Sie wollen einfach nur eine traditionelle if-else-Anweisung:

use std::cmp::max; 

fn main() { 
    assert_eq!(max(0, 3 - 5), 0); 
} 

:

fn main() { 
    let a = 3 - 5; 
    assert_eq!(if a < 0 { 0 } else { a }, 0); 
} 

Da Sie zwei Werte haben, die verglichen werden können, können Sie auch in max interessiert sein

Sie können machen Sie Ihre vorgeschlagene Syntax arbeiten, aber ich bin mir nicht sicher, es ist es wert. Vorgestellt ohne weiteren Kommentar ...

fn main() { 
    assert_eq!((3 - 5).but_if(|&v| v < 0).then(0), 0) 
} 

trait ButIf: Sized { 
    fn but_if<F>(self, f: F) -> ButIfTail<Self> 
     where F: FnOnce(&Self) -> bool; 
} 

// or `impl<T> ButIf for T {` for maximum flexibility 
impl ButIf for i32 { 
    fn but_if<F>(self, f: F) -> ButIfTail<Self> 
     where F: FnOnce(&Self) -> bool, 
    { 
     ButIfTail(f(&self), self) 
    } 
} 

struct ButIfTail<T>(bool, T); 

impl<T> ButIfTail<T> { 
    fn then(self, alt: T) -> T { 
     if self.0 { 
      alt 
     } else { 
      self.1 
     } 
    } 
} 
+1

Oh Gott. Zu viel abstrakte Fehlerbehandlung. Ich habe vergessen, wie man if-else-Anweisungen verwendet. -_- –

+2

Danke, dass Sie mein Gehirn furzen und damit rennen. Ausgezeichnete Antwort. :) –

2

denke ich, könnte dies die nächste Antwort auf den Geist dessen, was Sie wurden über ursprünglich denken, ohne viel individuelle Maschinen zu schaffen :)

assert_eq!(Some(3 - 5).into_iter().filter(|&v| v >= 0).next().unwrap_or(0), 0); 

Aber es ist wahrscheinlich mehr als ein Bissen, als du dir erhofft hast.