2014-12-26 55 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 = ... 

這可能與紅寶石?

+2

你的意思是'foo ['bar']'而不是'field ['bar']''? –

回答

1

喜歡這個

something_is_off = ! obj[:id] or ! begin 
            foo = JSON.parse obj[:foo] 
            ! foo['bar'] 
            rescue JSON::ParserError; end 
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 
+0

在Ruby中有許多方法可以做... –

1

而且以前的答案是絕對正確的,這是沒有必要引進新foo變量:

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

其實,something_is_off是假的,如果並且只有一個obj有一個:idobj[:foo]['bar']評估爲true。所以,KISS

+0

對於Ruby核心團隊來說,這是一個長期存在的難題,如何讓inline'rescue'只識別特定的異常。我爲此提出了一個新的關鍵字'resc',但它被拒絕了。您的解決方案犧牲了對「JSON :: ParserError」的特殊性,這超出了OP所要求的簡單句法簡化。而且,你的解決方案不會分配'foo'局部變量。也許提問者的代碼依賴於它後來... –

+0

@BorisStitnicky是否需要'foo'本地,它可能很容易分配內聯:'(foo = JSON.parse(obj [:foo]))['bar'] '。爲了處理'JSON :: ParserError',我放下了筆記。雖然問題是「如何將代碼信息變成'is_off = ...',那麼不需要處理特定的異常。此外,顯示的代碼提示,「obj'沒有鍵':foo'」的情況應該作爲'is_off = true'來處理。 – mudasobwa

+0

不要把它私人。這些只是我對重構一個片段的肛門保持性感受,其內容我不知道=) –