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

Nil에 대해 알아야 할 모든 것

없음...

정말 무엇입니까?

음, 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에서 "거짓"인 것은 두 가지뿐입니다. 다른 모든 것은 "진실"입니다.

이 게시물이 마음에 드셨다면 공유를 잊지 마세요. 좋아하는 소셜 네트워크에 올려보세요!