[RUBY-ON-RAILS] 중첩 된 해시를 액세스 할 때 어떻게 전무 요소에 대한 NoMethodError을 피하기 위해? [복제]
RUBY-ON-RAILS중첩 된 해시를 액세스 할 때 어떻게 전무 요소에 대한 NoMethodError을 피하기 위해? [복제]
내가 존재하지 않는 해시 요소에 액세스하려고하면, 나는 NoMethodError을 얻을 : 정의되지 않은 메서드 '[]'무기 호에 대한 : NilClass합니다. 그러나, 나는 요소가 존재합니다 예측할 수 없습니다.
@param_info = {}
@param_info["drug"]["name"]
# => NoMethodError: undefined method `[]' for nil:NilClass
어떻게 요소가 예기치 않게 전무 때이 오류를 제기하지 않도록 할 수 있습니까?
해결법
-
==============================
1.내가 제대로 질문을 이해한다면 즉 그 다음 다음을 시도 할 수, 속성 값이없는 경우에 용서합니다
내가 제대로 질문을 이해한다면 즉 그 다음 다음을 시도 할 수, 속성 값이없는 경우에 용서합니다
@param_info.try(:fetch, :drug).try(:fetch, :name)
이 힘 반환 전무뿐만 아니라,하지만이 전무에 대한 오류 정의되지 않은 방법 '[]'를 제거합니다 NilClass
최신 정보:
존재하지 않는 키를 처리하기 위해, 당신은 다음을 시도 할 수 있습니다. (해시에 대한 시도의 등가에서 힌트를 얻었다)
@param_info.try(:[], :drug).try(:[], :name)
-
==============================
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.나는 이런 짓을 할 것이다 :
나는 이런 짓을 할 것이다 :
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.당신은 단순히 시험이로하지 않는 한 사용할 수 있습니다 :
당신은 단순히 시험이로하지 않는 한 사용할 수 있습니다 :
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>
from https://stackoverflow.com/questions/20126592/how-to-avoid-nomethoderror-for-nil-elements-when-accessing-nested-hashes by cc-by-sa and MIT license
'RUBY-ON-RAILS' 카테고리의 다른 글
[RUBY-ON-RAILS] 레일 코드에 인코딩 루비? (0) | 2020.02.21 |
---|---|
[RUBY-ON-RAILS] 기본 키 및 개체 ID를 레일 (0) | 2020.02.21 |
[RUBY-ON-RAILS] 가입 집합의 모든 값을 포함해야하지만, 더 포함 할 수 SQL (0) | 2020.02.21 |
[RUBY-ON-RAILS] 때 "has_many을 :을 통해"사용하는 레일의 관계? (0) | 2020.02.21 |
[RUBY-ON-RAILS] 왜 들어오는 요청을 일으키는 내 CORS 구성은 필터 처리되지 않는 이유는 무엇입니까? 어떻게 그것이 단지 특정 기원의 요청을 수락 할 수 있습니까? (0) | 2020.02.21 |