ruby 우주선 연산자(<=>)란?

Posted by negabaro kim on Sunday, December 25, 2022 Tags: ruby/comparable   2 minute read

우주선 연산자란?

영어로 Three-way comparison 일본어로 宇宙船演算子라고 한다. 한국어로 뭐라 불러야 할지 모르겠지만 일본어를 그대로 번역하면 우주선 연산자

<=> 이 모양이 우주선이랑 비슷하다고 해서 지어진 이름 같다. & 외톨이 연산자(ぼっち演算子)도 그렇고 일본인의 작명센스는 스고이..

하는 일

   -1    0    1
----|----|----|----
    <    =    >

위와 같이 기호에 따라 반환하는데

좌측이 오른쪽보다 작으면 음수(-1) 좌측이 오른쪽보다 크다면 정수( 1) 좌측과 오른쪽이 같다면 제로( 0) 를 반환해준다.

또한 비교가 불가능한 경우 nil을 반환하므로 예외에 대한 처리도 신경쓸 필요가 없음

ex)

10 <=> 20   #  -1
20 <=> 10   #   1
20 <=> 20   #   0
20 <=> '20' # nil

사용예

sort커맨드와 같이 많이 사용

ary2 = ["9", "7", "10", "11", "8"]
p ary2.sort{|a, b| a.to_i <=> b.to_i }  #=> ["7", "8", "9", "10", "11"]

string형태의 값이어도 수치로서 계산이 가능해 편리하다.

sort만 사용할 경우 문자열로 비교하므로 아래와 같이 정렬된다.

ary2 = ["9", "7", "10", "11", "8"]
p ary2.sort                             #=> ["10", "11", "7", "8", "9"]

sort_by

sort_by를 써도 같은 결과가 나온다.

ary2 = ["9", "7", "10", "11", "8"]
p ary2.sort_by{|x| x.to_i }             #=> ["7", "8", "9", "10", "11"]