Что такое Рубин (космический корабль) оператор?
что такое Рубин <=>
(космический корабль) оператора? Реализован ли оператор на других языках?
6 ответов:
Perl, вероятно, был первым языком, который его использовал. Groovy-это еще один язык, который его поддерживает. В основном вместо возвращения
1
(true
) или0
(false
) в зависимости от того, являются ли аргументы равными или неравными, оператор космического корабля вернет1
,0
или−1
в зависимости от значения левого аргумента относительно правильного аргумента.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
это полезно для сортировки массива.
метод spaceship полезен, когда вы определяете его в своем собственном классе и включаете сравним модуль. Затем ваш класс получает
>, < , >=, <=, ==, and between?
методы бесплатно.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 self.value <=> 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 # [#<Card:0x0000000242d298 @value=7>, #<Card:0x0000000242d248 @value=8>, #<Card:0x0000000242d270 @value=10>]
Это общий оператор сравнения. Он возвращает либо -1, 0, либо +1 в зависимости от того, является ли его приемник меньше, равен или больше его аргумента.
объясню на простом примере
[1,3,2] <=> [2,2,2]
Ruby начнет сравнивать каждый элемент обоих массивов с левой стороны.
1
для левого массива меньше, чем2
правой массива. Следовательно, левый массив меньше правого массива. Выход будет-1
.
[2,3,2] <=> [2,2,2]
как указано выше, сначала он будет сравнивать первый элемент, который равен, затем он будет сравнивать второй элемент, в этом случае второй элемент левого массива больше, следовательно, выход
1
.
например, если у меня есть массив объектов, я могу делать вещи, как это:
# `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
этот базовый шаблон может быть обобщен для сортировки по любому количеству столбцов, в любой перестановке по возрастанию/убыванию на каждом.
что это
<=>
(Оператор "Космического Корабля")по словам RFC, который ввел оператор, $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
пример:
//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
подробнее:
// 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