Rust: "Befehl" im "Befehl"

  • Hallöle,

    folgende Funktion hab ich mir hergerichtet:

    let x1: i32 = y1 + y2;

    Als erstes initalisiere ich eine Variable die nicht veränderbar ist, i32-Datatyp aufweist und die folgenden Inhalt tragen soll, die Addition aus zweier früheren Variablen (y1, y2). Bisher ja ganz einfach.

    Jetzt habe ich aber noch y3 die den Operanden entscheiden soll, die enthält entweder "+", "-", "/", "*" , nichts anders.

    Jetzt kommt natürlich der Blue der sich in den Manuals eh nicht wirklich zurechtfindet und denkt sich was geiles aus:

    let x1: i32 = y1 y3 y2 oder let x1: i32 = 'y1' 'y3' 'y2' oder wie man auch immer das Abgrenzen will.. gibts überhaupt eine Abgrenzung?

    Natürlich.... funktioniert das nicht. War halt meine Vermutung weil ich glaube (!) das ich dies so ähnlich unter C leicht bewerkstelligen konnte.

    Ich hatte auf der #GluehPN schon gandro gefragt, er meinte auch das dies unter Rust leider relativ "bescheiden" ist. So hatte ich dann gegoogelt und war schon irgendwann bei if, else.

    Aber mal ehrlich, das kann doch nicht so umständlich sein? Ich möchte ja schließlich nur das er den eingegebenen Operanden da mit einsetzen. Mit if und else wird der Code ja unnötig vierfach oder achtfach so groß.

    Übersehe ich hier jetzt was peinliches? Wenn ja, lacht mich aus und erzählt es mir. Ich bin gespannt.

  • Wie im IRC schon geklärt ist ein match-Statement das einfachste und offensichtlichste. Die primitiven mathematischen Operationen sind in Rust wie in vielen anderen Sprachen (C, Java, Go, etc) nicht sogenannte Funktionen höherer Ordnung Funktionen die man herumreichen kann (anders als z.B. in Haskell). Es gibt jedoch abstrakte Interfaces in std::ops die zum Überladen der Operatoren gedacht sind, die hier verwendet werden können. Beispiel:

    Code
    use std::ops::Add;
    
    
    fn main() {
        let op = Add::<i32>::add;
        
        println!("{}", op(1, 2)); // 3
    }

    Eigentlich wollte ich jetzt schreiben, dass das fehlende Subtyping bei Traits in Rust dich daran hindert, einfach Code zu schreiben, der sowohl für Add als auch für z.B. Mul beides funktioniert. Allerdings bilden freistehende Funktionen (fn Typen) in Rust jedoch eine Ausnahme wo es Subtyping gibt weil sie alle als Funktionspointer verwendet werden können. Dementsprechend funktioniert folgender Code zu meiner kompletten Überraschung:

    Playground: https://play.rust-lang.org/?gist=662de9bc…&version=stable

    Man lernt halt nie aus. op ist dabei vom Typ fn(i32, i32) -> i32, also eine beliebige freistehende Funktion die zwei i32 nimmt und ein i32 zurückgibt.

    Einmal editiert, zuletzt von gandro (28. November 2017 um 21:42)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!