없음...
정말 무엇입니까?
음, nil
"빈" 또는 "기본" 값을 나타내는 데 사용되는 특수 Ruby 객체입니다. 또한 "거짓" 값입니다. 즉, false
처럼 동작합니다. 조건문에서 사용될 때.
지금 :
nil
은 하나만 있습니다. object_id
가 있는 개체 4
중 (또는 8
64비트 Ruby에서) 이것이 nil
인 이유의 일부입니다. 특별합니다.
nil.object_id # 4
자세히 살펴보겠습니다!
Nil 값은 어디에서 오는가?
많은 메서드가 nil
을 반환할 수 있습니다. 결과적으로.
값을 요청했지만 해당 값을 사용할 수 없는 경우에 발생합니다.
예 :
- 제품을 찾을 수 없음
- 배열 인덱스가 범위를 벗어남
- 해시 키가 존재하지 않습니다.
이를 보여주는 몇 가지 코드가 있습니다. :
arr = [1,2,3] arr[5] # nil
이것은 우리가 호출한 메서드가 nil
대신 유효한 값을 반환할 것으로 예상하기 때문에 종종 모든 종류의 문제로 이어질 것입니다. .
NoMethodError
와 같이 예외:
arr[5].size # NoMethodError: undefined method 'size' for nil:NilClass
이 오류를 방지하려면 nil
이 있는지 확인해야 합니다. 메소드를 호출하기 전에 값을 지정하십시오.
루비에서 Nil 테스트
"nil:NilClass에 대한 정의되지 않은 메서드" 오류가 발생하지 않으려면 다음을 시도하십시오...
nil이 아닌 경우에만 메소드 호출 :
if array[5] && array[5].size # do something... end
이것이 Ruby 2.3이 "safe navigator" 연산자(&.
).
예 :
if arr[5]&.size # do something... end
nil을 테스트하는 또 다른 방법은 nil?
을 사용하는 것입니다. 방법:
if @bacon.nil? # ... end
또 다른 옵션은 blank?
를 사용하는 것입니다. 방법(Rails만 해당).
작업 중인 개체에 따라 nil
검사를 피하기 위해 사용할 수 있는 몇 가지 기술이 있습니다. 가치를 완전히.
예를 들어 fetch
를 사용할 수 있습니다. 해시 및 배열 개체에 대한 메서드입니다.
또는 nil
대신 기본값을 반환하려는 경우 자체 클래스에서 "Null Object Pattern"을 사용할 수 있습니다. .
Nil이 숨어 있는 다른 장소
정의되지 않은 인스턴스 변수는 nil
을 반환합니다. .
@foo # nil
따라서 인스턴스 변수의 이름을 잘못 입력했거나 초기화하는 것을 잊었을 수 있으므로 주의하십시오!
nil
을 찾을 수 있는 또 다른 장소 puts
&print
방법.
이 두 메서드는 항상 nil
을 반환합니다. .
일부 학생들이 다음과 같이 시도하는 것을 보았기 때문에 이 말을 하는 것입니다.
numbers = [1,2,3].map { |n| puts n * 2 }
결과는 numbers
[nil, nil, nil]
. 이 경우의 해결책은 단순히 puts
를 제거하는 것입니다. 블록 내부에서.
NilClass 이해
다른 Ruby 객체와 마찬가지로 nil
일련의 방법이 있습니다.
Rubinius의 클래스 정의는 다음과 같습니다.
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
이 모든 to_something
메서드는 빈 값을 반환합니다(0
숫자).
빈 해시, 빈 문자열, 빈 배열…
그 이유는 nil
"아무것도"를 나타내는 데 사용됩니다.
널 개체 패턴
nil
에 대한 토론 없음 Null 개체 패턴을 언급하지 않고 완료되었습니다.
그녀의 훌륭한 연설인 "Nothing is Something"에서 Sandi Metz는 nil
동안 "아무것도"를 의미합니다. 더 구체적인 의미를 가질 수 있습니다.
예를 들어 제품을 찾는 메서드를 작성하고 기본 제품을 반환하려는 경우…
이와 같은 null 제품을 반품할 수 있습니다. :
class MissingProduct def name "Product not found" end end
이제 실제 제품 개체와 null 제품이 혼합된 배열이 있는 경우 이러한 모든 제품에는 name
이 있습니다. 방법. 즉, NoMethodError
가 발생하지 않습니다. 예외.
도움말 :객체 유형을 확인할 필요 없이 모든 객체를 동일한 방식으로 처리할 수 있다면 다형성을 이용하는 것입니다.
이러한 종류의 개체는 프레젠테이션 계층에 적합하지만 경고 메시지 표시, 리디렉션 등과 같이 찾고 있는 것을 사용할 수 없는 경우 다른 작업을 수행하려는 컨트롤러에는 그다지 적합하지 않습니다.
진실
nil
에 대해 알아야 할 또 다른 사항 false
외에 유일한 값입니다. (객체이기도 함) "거짓"으로 간주됩니다.
Ruby의 다른 모든 항목은 true
로 간주됩니다. 부울 컨텍스트에서.
일부 언어는 숫자를 0
으로 간주합니다. false
으로 가치가 있지만 Ruby에서는 그렇지 않습니다.
if 0 puts 123 end # 123
이것은 "if 0
true
입니다. 그런 다음 123
을 인쇄하십시오. ".
동영상
요약
nil
"아무것도"를 나타내는 Ruby 개체일 뿐입니다.
또한 nil
&false
Ruby에서 "거짓"인 것은 두 가지뿐입니다. 다른 모든 것은 "진실"입니다.
이 게시물이 마음에 드셨다면 공유를 잊지 마세요. 좋아하는 소셜 네트워크에 올려보세요!