Ruby 코드에 대해 친구와 채팅을 하다가 반환 값에 대한 주제가 나왔습니다...
...물론 nil
항상 대화의 일부입니다.
그날 늦게 나는 잠을 자려고 침대에 누워 왜 nil
을 사용할까 생각했습니다. ?
나는 다음 날 이것에 대해 쓰는 것이 좋을 것이라고 생각했고, 여기에 내가 있습니다. 이 내용이 흥미롭고 새로운 내용을 배우시기 바랍니다.
반환 값 및 예상 동작
select
와 같은 메소드를 호출할 때 항상 배열을 얻게 됩니다.
선택 항목이 없더라도.
예 :
[1,2,3].select {} # [] [1,2,3].select(&:even?) # [2]
하지만 이것이 왜 중요한가요?
좋은 질문입니다!
항상 배열을 얻는 경우 배열 메서드(size
, empty?
, push
…) 실제로 어레이로 작업하고 있는지 확인할 필요 없이 .
클래스 검사가 높은 결합으로 이어지기 때문에 좋은 일입니다.
더 유연한 코드를 작성하려면 '이 클래스가 무엇인지' 확인하지 마세요. 최대한 많이.
단일 값 반환
좋습니다. 하지만 find
와 같은 방법을 사용하는 것은 어떻습니까? , 하나의 값만 반환합니까?
요소가 발견되면 작동합니다.
[1,2,3].find { |n| n == 2 } # 2
일치하는 항목이 없으면 find
무언가를 반환해야 하는 경우 false
를 반환할 수 있습니다. 하지만 이 반환 값에 대한 메서드를 호출할 것으로 예상하면 예외가 발생합니다.
nil
은 다음과 같습니다. 일반적인 Null 개체에 가장 근접하기 때문에 사용합니다.
nil에 대한 나의 지난 기사에서 기억할 수 있듯이, 나는 어떻게 nil
to_i
와 같은 메소드가 있는 클래스입니다. , to_s
&to_a
.
이를 통해 Array()
와 같은 메서드를 사용할 수 있습니다. 및 String()
개체를 이러한 유형으로 변환합니다.
예 :
String(123) # "123" String(nil) # "" Array(nil) # []
이것은 문자열 보간에서도 나타납니다.
"abc#{nil}dfg"
문자열 보간 호출 to_s
보간 블록 내부에 무엇이 있는지 평가한 결과입니다. 따라서 #{1 + 1}
가 있는 경우 이것은 2.to_s
로 변환됩니다. .
이제 문제 nil
포함 예상하지 못한 경우 온다 , 당신은 그것이 foo
메서드가 아니므로 두려운 NoMethodError
예외.
이 경우 이 기사에서 설명한 것처럼 Null 개체 패턴을 구현하려고 합니다. 다른 솔루션에는 fetch
사용이 포함됩니다. 기본값이 있는 메서드 및 기본값이 의미가 없을 때 예외 발생
요약
nil
을 사용하는 이유를 배웠습니다. , nil
의 메소드 호출에서 발생하는 예외를 피하는 방법 가치, 그리고 더 자신 있는 코드를 작성하는 방법.
코드를 살펴보고 유형 검사 코드를 찾을 수 있는지 확인 (is_a?
/ kind_of?
/ ===
). 오늘 배운 내용을 사용하여 해당 코드를 어떻게 개선할 수 있습니까?