본문 바로가기
Ruby on Rails

Ruby nil 처리하기

by 혜리루 2019. 11. 14.

1. assignment operator ||=

 

오늘 rails로 개발 중 구글링을 하다가 이런 라인을 발견했습니다.

 

number ||= 1

또잉 이게 무슨 연산자일까요?

 

1. ||는 다른 언어에서 보통 논리연산자 or로 사용됩니다.

2.  x*=2 , x+=1 처럼 어떤 연산자 뒤에 =이 붙었다면 앞의 연산자로 연산을 시행 한 후 변수에 다시 대입을 해주는 복합 대입 연산자라고 볼 수 있습니다.

 

합리적인 추론에 의하면 ||= 는 or연산을 시행한 값을 number에 대입해주는 복합 대입 연산자라고 할 수 있겠네요.

 

3. ||의 피연산자에 true나 false가 아닌 nil과 객체가 왔을때 결과값은 다음과 같습니다.

nil || 0 => 0

1 || 0 => 1

0 || 1 => 0

nil || nil => nil

 

위의 코드는 number 변수가 nil일때 1으로 바꿔주는 기능을 하는 코드였습니다.

루비 코드로 풀어쓰자면 아래의 코드와 같은 기능을 합니다.

if number.nil?
  number = 1
end

 

저는 이런 연산자를 오늘 태어나서 처음 봤는데요, 정말 너무 신기했습니다.. 루비에서는 이런식으로 코드를 짧게 줄일 수 있는 문법이나 함수를 많이 제공하는 것 같습니다. 

 

그래서 내친김에 다른 복합대입연산자도 사용해보았는데요,

number = nil
number += 1
# undefined method `+' for nil:NilClass

exception을 던집니다.

 

nil은 논리연산은 가능하지만 산술연산은 불가능 하기 떄문입니다. 이럴때는 아래의 연산자를 이용할 수 있습니다.

 

 

2. Safe navigation operator &.

&.은 말그대로 안전하게 navigate를 할 수 있는 연산자입니다.

객체의 필드를 참조하거나 메소드를 호출할때 우리는 object.field 이런식으로 코드를 작성하게 되는데요,

이 코드는 object가 nil일때 exception을 던지게 됩니다.

 

이때 사용할 수 있는 연산자가 &.입니다. 

변수 object가 nil일때 object&.field는 exception을 던지지않고 nil을 리턴합니다.

object = nil
object&.field 
# nil

 

&.는 필드나 메소드 뿐 아니라 연산자에도 적용이 가능합니다.

 

number = nil
number + 1
# undefined method `+' for nil:NilClass

number&.+1
# nil

 

3. nil 클래스의 메소드

 

nil은 루비의 다양한 객체 중 하나 입니다. 

nil.class
# NilClass

이 처럼 nil은 NilClass라는 클래스의 객체인데요. 이 클래스에서는 nil을 처리하는 다양한 메소드들을 제공합니다.

 

class NilClass
  def to_s
    ""
  end
  def inspect
    "nil"
  end
  def nil?
    true
  end
  def to_a
    []
  end
  def to_f
    0.0
  end
  def to_i
    0
  end
  def to_c
    Complex(0)
  end
  def to_h
    {}
  end
end

위의 메소드들을 활용하면 nil을 각각의 빈 객체들로 변환할 수 있습니다.

 

댓글