2012-03-03 7 views
0
undefined method `[]=' for nil:NilClass 

코드 :어떤 점이 직렬 점에서 nil인지 빠르게 결정합니까?

a.b.c.d['test'].e['foo'] 

내 솔루션 :

puts "got it: #{a.inspect}" if a.nil? 
puts "got it: #{a.b.inspect}" if a.b.nil? 
puts "got it: #{a.b.c.inspect}" if a.b.c.nil? 

옆의 생산 예외를 처리 할 수. 또한 개발 단계에서 객체를 더 빠르게 찾을 수 있습니다.

(https://stackoverflow.com/questions/9159032/is-there-a-nicer-way-to-write-this-type-of-nil-check)

답변

1

난 당신의 코드에서 할당이 표시되지 않기 때문에이 코드는 오류가 발생하지 않을 것입니다.

def a 
    # wherever you get a from 
    end 

    def b 
    a.b 
    end 

    # ... 

    def d(key) 
    c.d["key"] 
    end 

    def e(key) 
    d.e["key"] 
    end 

e("foo") = "value" 

네, 과잉, 그래서 가장 좋은 방법은 :이되는 전무 중 일부에 대해 걱정한다면, 이러한 때 당신이 좋은 스택 추적을 얻을 것이다 전무하기 때문에, 방법에 코드를 리팩토링 고려 당신이 기대하지 않는 곳에서 nils를 반환하지 않도록하는 것이지만, 로그에서 좋은 스택 추적이 필요한 경우,이 트릭을 수행 할 것입니다.

2

간단히 말해서, 아니요.

그러나 코드가 Law of Demeter을 위반하지 않도록 수정하면 이러한 호출이 분리되어 체인에 하나의 호출 만있게됩니다. b.c 구제 수단이 문제를 반환 a의 클래스에 몇 가지 방법 d를 호출하면 c 전화를하는 장소는하지만, c의 표현이 없기 때문에

a.b.c 

나쁜 :

예를 들어

그리고 결국 당신은 결국 :

a.d 
관련 문제