없음...
정말 무엇입니까?
음, 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에서 "거짓"인 것은 두 가지뿐입니다. 다른 모든 것은 "진실"입니다.
이 게시물이 마음에 드셨다면 공유를 잊지 마세요. 좋아하는 소셜 네트워크에 올려보세요!