2014-05-15 2 views
1

는 내가 확인 할 실제 재산은 속성해시에서 중첩 된 속성을 확인하려면 어떻게해야합니까? 오류 :

 empty = if @body && 
     @body["#{@path}_response".to_sym] && 
     @body["#{@path}_response".to_sym]["#{@path}_result".to_sym] && 
     @body["#{@path}_response".to_sym]["#{@path}_result".to_sym][:error][:error_code].eql?'NoAvailibilitiesFound' 

      true 
      else 
      false 
      end 

에 대한 중첩 된 해시를 확인해야합니다. 그러나

@body["#{@path}_response".to_sym] 

도 존재하지 않을 수도 있습니다. 그래서 각 레벨에서 속성을 확인합니다.

이것은 나에게 이상하게 보입니다. 더 잘 할 수있는 우아한 '루비쉬 (rubyish)'방법이 있습니까?

답변

2

@Paul에 동의합니다. Hash#fetch을 사용해야합니다. Paul은 기본값을 사용하는 것을 암시했지만 지나치게 복잡하다고 생각했습니다. 사실, 그것은 매우 간단합니다 : 그냥 기본 빈 해시 만들과 같이 : 여기

h = { a: { b: {c: 1} } } #=> {:a=>{:b=>{:c=>1}}} 

h.fetch(:a, {}).fetch(:b, {}).fetch(:c, false) #=> 1 
h.fetch(:a, {}).fetch(:b, {}).fetch(:d, false) #=> false 
h.fetch(:a, {}).fetch(:d, {}).fetch(:c, false) #=> false 
h.fetch(:d, {}).fetch(:b, {}).fetch(:c, false) #=> false 

내가 1:a, :b:c는 각 수준에있는 경우 반환 할 것을 가정하고있다; 그렇지 않으면 false이 리턴됩니다.

+0

아, 괜찮습니다. 내가 생각한 것만 큼 나쁘지는 않다. 나는 버려지기 전에 나의 버전에서 더 많은 쓰레기를 가지고 있었다. –

1

아마도이 작업을 수행하는 데는 몇 가지 방법이 있지만 내가 생각할 수있는 유일한 방법은 Hash#fetch 메서드입니다. 문서에 따라 :

주어진 키의 해시 값을 반환합니다. 키가 일 수없는 경우 몇 가지 옵션이 있습니다. 다른 인수가 없으면 은 KeyError 예외를 발생시킵니다. 기본값이 주어지면 이 리턴됩니다. 선택적 코드 블록이 지정되면 이 실행되고 그 결과가 리턴됩니다.

당신이 :error_code의 값이 특정 값과 동일, 또는 허위 여부, 난 당신이 KeyError 옵션을 활용할 수 있으리라 생각은하지 않습니다 (또는 구조가 다르다) 경우 알아야 할 것 때문에, 그리고 예외가 발생하면 false를 반환합니다.

def your_method 
    @body.fetch("#{@path}_response".to_sym).fetch("#{@path}_result".to_sym).fetch(:error).fetch(:error_code).eql? 'NoAvailibilitiesFound' 
rescue KeyError 
    false 
end 

잠재적으로 설명서에 설명 된대로 "defaults"옵션을 사용할 수도 있습니다. 그러나 예제를 작성하려고 시도하면서 쉽게 읽을 수 없을 정도로 지저분하고 거의 불가능하다는 것을 알았습니다.

내가 말했듯이, 아마도 다른 방법이 많이 있지만 희망적으로는 충분합니다. 그게 합리적인지 알려주세요.

관련 문제