Was ist der Operator Ruby (Raumschiff)?

Was ist der Operator Ruby (Raumschiff)? Wird der Operator von anderen Sprachen implementiert?

    Perl war wahrscheinlich die erste Sprache, die es verwendete. Groovy ist eine andere Sprache, die es unterstützt. Anstatt 1 ( true ) oder 0 ( false ) zurückzugeben, abhängig davon, ob die Argumente gleich oder ungleich sind, gibt der Raumschiffoperator 1 , 0 oder −1 abhängig vom Wert des linken Arguments relativ zum rechten Argument.

     a < => b := if a < b then return -1 if a = b then return 0 if a > b then return 1 if a and b are not comparable then return nil 

    Es ist nützlich, um ein Array zu sortieren.

    Die Raumschiffmethode ist nützlich, wenn Sie sie in Ihrer eigenen class definieren und das Vergleichsmodul enthalten . Ihre class erhält dann die >, < , >=, < =, ==, and between? Methoden kostenlos.

     class Card include Comparable attr_reader :value def initialize(value) @value = value end def < => (other) #1 if self>other; 0 if self==other; -1 if self other.value end end a = Card.new(7) b = Card.new(10) c = Card.new(8) puts a > b # false puts c.between?(a,b) # true # Array#sort uses < => : p [a,b,c].sort # [#, #, #] 

    Es ist ein allgemeiner Vergleichsoperator. Je nachdem, ob der Empfänger kleiner, gleich oder größer als sein Argument ist, wird entweder -1, 0 oder +1 zurückgegeben.

    Ich werde das mit einem einfachen Beispiel erklären

    1. [1,3,2] < => [2,2,2]

      Ruby beginnt mit dem Vergleich jedes Elements beider Arrays von der linken Seite. 1 für linkes Array ist kleiner als 2 für rechtes Array. Daher ist das linke Array kleiner als das rechte Array. Ausgabe wird -1 .

    2. [2,3,2] < => [2,2,2]

      Wie oben wird zuerst das erste Element verglichen, die gleich sind, dann wird das zweite Element verglichen, in diesem Fall ist das zweite Element der linken Anordnung größer, daher ist die Ausgabe 1 .

    Da dieser Operator Vergleiche mit einem Integer-Ausdruck reduziert, bietet er die allgemeinste Möglichkeit zum Sortieren aufsteigend oder absteigend basierend auf mehreren Spalten / Attributen.

    Zum Beispiel, wenn ich ein Array von Objekten habe, kann ich Folgendes tun:

     # `sort!` modifies array in place, avoids duplicating if it's large... # Sort by zip code, ascending my_objects.sort! { |a, b| a.zip < => b.zip } # Sort by zip code, descending my_objects.sort! { |a, b| b.zip < => a.zip } # ...same as... my_objects.sort! { |a, b| -1 * (a.zip < => b.zip) } # Sort by last name, then first my_objects.sort! { |a, b| 2 * (a.last < => b.last) + (a.first < => b.first) } # Sort by zip, then age descending, then last name, then first my_objects.sort! do |a, b| 4 * (a.zip < => b.zip) + -3 * (a.age < => b.age) + 2 * (a.last < => b.last) + (a.first < => b.first) end 

    Dieses Grundmuster kann verallgemeinert werden, um nach jeder Anzahl von Spalten in jeder Permutation von aufsteigender / absteigender Reihenfolge zu sortieren.

    Was ist < => (Der ‘Raumschiff’-Betreiber)

    Nach dem RFC, der den Operator eingeführt hat , $ a < => $ b

      - 0 if $a == $b - -1 if $a < $b - 1 if $a > $b 

      - Return 0 if values on either side are equal - Return 1 if value on the left is greater - Return -1 if the value on the right is greater 

    Beispiel:

     //Comparing Integers echo 1 < => 1; //ouputs 0 echo 3 < => 4; //outputs -1 echo 4 < => 3; //outputs 1 //String Comparison echo "x" < => "x"; // 0 echo "x" < => "y"; //-1 echo "y" < => "x"; //1 

    MEHR:

     // Integers echo 1 < => 1; // 0 echo 1 < => 2; // -1 echo 2 < => 1; // 1 // Floats echo 1.5 < => 1.5; // 0 echo 1.5 < => 2.5; // -1 echo 2.5 < => 1.5; // 1 // Strings echo "a" < => "a"; // 0 echo "a" < => "b"; // -1 echo "b" < => "a"; // 1 echo "a" < => "aa"; // -1 echo "zz" < => "aa"; // 1 // Arrays echo [] < => []; // 0 echo [1, 2, 3] < => [1, 2, 3]; // 0 echo [1, 2, 3] < => []; // 1 echo [1, 2, 3] < => [1, 2, 1]; // 1 echo [1, 2, 3] < => [1, 2, 4]; // -1 // Objects $a = (object) ["a" => "b"]; $b = (object) ["a" => "b"]; echo $a < => $b; // 0