복붙노트

[RUBY-ON-RAILS] 중첩 된 해시를 액세스 할 때 어떻게 전무 요소에 대한 NoMethodError을 피하기 위해? [복제]

RUBY-ON-RAILS

중첩 된 해시를 액세스 할 때 어떻게 전무 요소에 대한 NoMethodError을 피하기 위해? [복제]

내가 존재하지 않는 해시 요소에 액세스하려고하면, 나는 NoMethodError을 얻을 : 정의되지 않은 메서드 '[]'무기 호에 대한 : NilClass합니다. 그러나, 나는 요소가 존재합니다 예측할 수 없습니다.

@param_info = {}
@param_info["drug"]["name"]
# => NoMethodError: undefined method `[]' for nil:NilClass

어떻게 요소가 예기치 않게 전무 때이 오류를 제기하지 않도록 할 수 있습니까?

해결법

  1. ==============================

    1.내가 제대로 질문을 이해한다면 즉 그 다음 다음을 시도 할 수, 속성 값이없는 경우에 용서합니다

    내가 제대로 질문을 이해한다면 즉 그 다음 다음을 시도 할 수, 속성 값이없는 경우에 용서합니다

    @param_info.try(:fetch, :drug).try(:fetch, :name)
    

    이 힘 반환 전무뿐만 아니라,하지만이 전무에 대한 오류 정의되지 않은 방법 '[]'를 제거합니다 NilClass

    최신 정보:

    존재하지 않는 키를 처리하기 위해, 당신은 다음을 시도 할 수 있습니다. (해시에 대한 시도의 등가에서 힌트를 얻었다)

    @param_info.try(:[], :drug).try(:[], :name)
    
  2. ==============================

    2.루비 2.3.0 완전히이 문제를 해결 해시와 배열 모두에서 발굴이라는 새로운 방법을 도입했다.

    루비 2.3.0 완전히이 문제를 해결 해시와 배열 모두에서 발굴이라는 새로운 방법을 도입했다.

    이 요소가 중첩의 모든 수준에서 누락 된 경우 nil을 반환합니다.

    h1 = {}
    h2 = { a: {} }
    h3 = { a: { b: 100 } }
    
    h1.dig(:a, :b) # => nil
    h2.dig(:a, :b) # => nil
    h3.dig(:a, :b) # => 100
    

    사용 사례는 다음과 같이 보일 것이다 :

    @param_info.dig('drug', 'name')
    
  3. ==============================

    3.나는 이런 짓을 할 것이다 :

    나는 이런 짓을 할 것이다 :

    begin
      @param_info.fetch(:drug).fetch(:name)
    rescue KeyError
      # handle key not found
    end
    

    당신은 하나의 함수에서 그것을 할 수 있습니다 :

    def param_info_key(info, key1, key2)
      info.fetch(key1).fetch(key2)
    rescue KeyError
      nil
    end
    
    param_info_key({}, :a, :b) # nil
    param_info_key({a: {}}, :a, :b) # nil
    param_info_key({a: {b: "foo"}}, :a, :b) # "foo"
    

    샘플 :

    irb(main):001:0> s = {}
    => {}
    irb(main):002:0> begin
    irb(main):003:1*   s.fetch(:foo).fetch(:bar)
    irb(main):004:1> rescue KeyError
    irb(main):005:1>   puts "Key not found"
    irb(main):006:1> end
    Key not found
    => nil
    
  4. ==============================

    4.당신은 단순히 시험이로하지 않는 한 사용할 수 있습니다 :

    당신은 단순히 시험이로하지 않는 한 사용할 수 있습니다 :

    irb(main):001:0> def checker(val)
    irb(main):002:1>   unless val.nil?
    irb(main):003:2>     puts 'working on the railroad'
    irb(main):004:2>     end
    irb(main):005:1>   end
    => nil
    irb(main):006:0> x = nil
    => nil
    irb(main):007:0> checker(x)
    => nil
    irb(main):008:0> y = 1
    => 1
    irb(main):009:0> checker(y)
    working on the railroad
    => nil
    irb(main):010:0> 
    
  5. from https://stackoverflow.com/questions/20126592/how-to-avoid-nomethoderror-for-nil-elements-when-accessing-nested-hashes by cc-by-sa and MIT license