2013-06-29 3 views
6

값이 있거나 없을 수있는 해시를 가져올 때 오류 메시지가 표시되지 않도록하려고합니다. 나는 값을 반환하거나 nil을 반환하기를 원한다.해시 값을 가져 오려고 시도 할 때`try` 메서드

나는 try 메쏘드가 그것을 할 것이라고 생각했지만 여전히 오류가 발생합니다.

key not found: "en" 

내 해시 내가이 일 것이라고 생각

@object.content.try(:fetch, 'en') # should return nil, but errors even with try method 

content['en'] ... content라는 hstore 열 등

content = {"es"=>"This is an amazing event!!!!!", "pl"=>"Gonna be crap!"} 

시도 방법이지만 그렇지 않습니다. 다른 방법으로 오류 대신 nil을 반환 할 수 있습니까? 또한

콘텐츠 필드 자체도 될 수 nil 그래서 전화 content['en'] 예외 :

undefined method `content' for nil:NilClass 

답변

17

당신이 object.content.nil?를 허용해야하는 경우에, 당신은 try을 사용하십시오. 누락 된 키를 허용하려면 fetch (Priti notes)을 사용하지 않으려면 보통 [] 메서드를 사용하십시오. 두 수율을 결합 :

object.content.try(:[], 'en') 

가 관찰 : 당신은 또한 당신을 조롱처럼 :[] 보이는 object.content.try(:fetch, 'en', nil) 경우 사용할 수

> h = { :a => :b } 
=> {:a=>:b} 
> h.try(:[], :a) 
=> :b 
> h.try(:[], :c) 
=> nil 
> h = nil 
=> nil 
> h.try(:[], :a) 
=> nil 

.

+2

또한 ('object.content.try를 사용할 수 있습니다 * : '엉'은, 전무)'경우는'가져 오기 :. 당신을 조롱처럼 []'보이는 * - 나는 당신이 문을 좋아한다 .. '해시 # 가져 오기', 내가 좋아하는 방법 .. :)) –

3

그냥 일반적인 인덱싱을 사용

content['en'] #=> nil 
+0

woops, 내 질문에 중요한 세부 사항 하나를 깜빡했습니다. 콘텐츠 자체가 nil 콘텐츠 인 경우 [ 'en'] 정의되지 않은 메서드 오류가 발생합니다. – holden

+0

@Holden : 알았어. 죄송합니다. – Linuxios

+0

전혀, 당신의 대답은 내 질문을 개선하고 내가 필요한 답변을 얻을 도움이되지! 감사합니다 – holden

8

Hash#fetch

을 참조하십시오 값을 반환 지정된 키의 해시로부터 취득합니다. 키를 찾을 수없는 경우 몇 가지 옵션이 있습니다. 다른 인수가없는 경우 KeyError 예외가 발생합니다.; 기본값이 주어지면 반환됩니다. 선택적 코드 블록이 지정되면 실행되고 결과가 리턴됩니다.

h = { "a" => 100, "b" => 200 } 
h.fetch("z") 
# ~> -:17:in `fetch': key not found: "z" (KeyError) 

그래서 사용

h = { "a" => 100, "b" => 200 } 
h.fetch("z",nil) 
# => nil 
h.fetch("a",nil) 
# => 100 
+1

한'h.fetch ('z는'무기 호) '다음이 아닌 예외 던지는 버전이 될 것이다. 내가 늦게 –

+0

@JoachimIsaksson은 여기에 업데이트 할 .. 내 편집기로 교수형에 처해있어 .. : (( –

2

Ruby 2.0부터 nil 해시에 try을 사용하면 해시가 깔끔하지 않습니다. NilClass#to_h을 사용할 수 있습니다. 키가 없을 때 nil을 반환하는 경우는 정확히 []인데, 이는 fetch을 대상으로합니다.

@object.content.to_h["en"] 
관련 문제