Computer >> 컴퓨터 >  >> 프로그램 작성 >> Ruby

왜 우리는 Nil을 사용합니까?

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? / === ). 오늘 배운 내용을 사용하여 해당 코드를 어떻게 개선할 수 있습니까?