Вопрос

Что такое Ruby <=> оператор (космического корабля)?Реализован ли оператор на каких-либо других языках?

Это было полезно?

Решение

Perl, вероятно, был первым языком, использовавшим его. Groovy - это другой язык, который его поддерживает. По сути, вместо возврата 1 ( true ) или 0 ( false ) в зависимости от того, равны ли аргументы или нет оператор космического корабля вернет 1 , 0 или & # 8722; 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

Это полезно для сортировки массива.

Другие советы

Метод космического корабля полезен, когда вы определяете его в своем собственном классе и включаете сопоставимый модуль . Ваш класс получит > ;, < , > =, < =, == и между? методами бесплатно.

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
    
    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top