2014-12-26 4 views
1
이 코드를 켜려고합니다

: 다음과 같은 종류의 무언가로루비에서 복잡한 표현식을 평가하는 방법은 무엇입니까?

if obj[:id] 
    begin 
    foo = JSON.parse(obj[:foo]) 
    if ! foo['bar'] 
     something_is_off = true 
    end 
    rescue JSON::ParserError 
    something_is_off = true 
    end 
else 
    something_is_off = true 
end 

을 :

something_is_off = ... 

루비와이 가능합니까? 다음은이

something_is_off = ! obj[:id] or ! begin 
            foo = JSON.parse obj[:foo] 
            ! foo['bar'] 
            rescue JSON::ParserError; end 
+2

'field [ 'bar']'대신'foo [ 'bar']'를 의미합니까? –

답변

1

내가 무슨 짓을했는지 :

something_is_off = lambda { 
    return true unless obj[:id] 
    begin 
    foo = JSON.parse(obj[:foo]) 
    rescue JSON::ParserError 
    return true 
    end 
    ! foo['bar'] 
}.call 
1

처럼

+0

Ruby에서 여러 가지 일을 할 수있는 방법이 있습니다. –

1

는 또한 이전의 대답은 절대적으로 올바른, 그것은 새로운 foo 변수를 도입 할 필요는 없습니다 : 사실

something_is_off = !(obj[:id] && JSON.parse(obj[:foo])['bar']) rescue true 

을 , something_is_off은 거짓말이며 obj:id이고 obj[:foo]['bar']은 true로 평가됩니다. 그래서 KISS.

+0

Ruby 핵심 팀이 인라인 구조 '특정'예외 만 인식하도록하는 방법에 대한 오해의 수수께끼입니다. 이 키워드에 대해 새로운 키워드'resc'를 제안했지만 거부되었습니다. 당신의 솔루션은 OP에 의해 요청 된 단순한 통어론 단순화를 뛰어 넘는'JSON :: ParserError'에 특이성을 희생합니다. 게다가, 당신의 솔루션은'foo' 지역 변수를 할당하지 않습니다. asker의 코드는 나중에 somwhere에 의존합니다 ... –

+0

@BorisStitnicky'foo' 로컬이 필요한지 여부는 인라인으로 쉽게 지정 될 수 있습니다 :'(foo = JSON.parse (obj [: foo])) [ 'bar'] '. 'JSON :: ParserError'를 다루기 위해 필자는 노트를 삭제했다. "is_off = ..."코드 정보를 돌리는 방법은 문제가 아니지만 특정 예외를 처리 할 필요는 없습니다. 또한, 표시된 코드는 "obj"키가 없다는 것을 암시합니다 :'foo'는'is_off = true'로 처리되어야합니다. – mudasobwa

+0

개인적으로 취급하지 마십시오. 그것들은 내가 알지 못하는 내용을 리팩터링하는 것에 대한 내 항문 보유력입니다. –

관련 문제