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
}
}
}
Oh Gott. Zu viel abstrakte Fehlerbehandlung. Ich habe vergessen, wie man if-else-Anweisungen verwendet. -_- –
Danke, dass Sie mein Gehirn furzen und damit rennen. Ausgezeichnete Antwort. :) –