Programing

Ruby <=> (우주선) 연산자는 무엇입니까?

lottogame 2020. 4. 6. 07:55
반응형

Ruby <=> (우주선) 연산자는 무엇입니까?


루비 <=>(우주선) 연산자는 무엇입니까? 운영자가 다른 언어로 구현 되었습니까?


펄은 그것을 사용한 첫 번째 언어 일 것입니다. 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

배열을 정렬하는 데 유용합니다.


우주선 방법은 자신의 클래스에서 정의하고 Comparable 모듈을 포함 할 때 유용 합니다 . 그러면 수업 >, < , >=, <=, ==, 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. [1,3,2] <=> [2,2,2]

    Ruby는 두 배열의 각 요소를 왼쪽에서 비교하기 시작합니다. 1왼쪽 배열 2의 경우 오른쪽 배열 보다 작습니다 . 따라서 왼쪽 배열은 오른쪽 배열보다 작습니다. 출력은입니다 -1.

  2. [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
# [Notice powers of 2 make it work for > 2 columns.]
my_objects.sort! do |a, b|
      8 * (a.zip   <=> b.zip) +
     -4 * (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

참고 URL : https://stackoverflow.com/questions/827649/what-is-the-ruby-spaceship-operator

반응형