2013-03-13 54 views
13

我最近得知您可以在代碼行上使用rescue,以防該行出現問題(請參閱http://www.rubyinside.com/21-ruby-tricks-902.html提示#21)。我有一些代碼,用於這個樣子:Ruby Oneline Rescue

if obj['key'] && obj['key']['key2'] && obj['key']['key2']['name'] 
    name = obj['key']['key2']['name'] 
else 
    name = '' 
end 

隨着rescue方法,我相信我可以更改代碼弄成這個樣子:

name = obj['key']['key2']['name'] rescue '' 

如果無異常隨時拋出訪問哈希的級別,它應該被救援抓住並給我「,這就是我想要的。如果這是所需的行爲,我也可以選擇將名稱設置爲nil

這樣做有沒有已知的危險?我問,因爲這似乎太好了,是不對的。我有很多難看的代碼,我很想擺脫它,看起來像第一個代碼示例。

+0

對於特定用途,內嵌'急救'是安全的。在方法調用結束時非常小心地使用它,在其他情況下可能會引發異常,可能是因爲I/O錯誤或缺少數據庫信息。調試這些情況確實非常困難,並且會讓你變得瘋狂。 – 2013-03-13 22:05:02

回答

11

Reads good!但它會打擊你的表現。根據我的經驗,rescue觸發時速度要慢得多,而當觸發時慢一點。在所有情況下,if都更快。要考慮的其他事情是,不應該預料到異常,而且您也有這種代碼。有一個哈希這麼深的嵌套可能是一個很好聞,一個重構是nede

+0

哈希來自返回深度嵌套JSON的Web服務。我一直在檢查nils,因爲服務通常會讓嵌套元素無效。 – 2013-03-13 21:49:50

+0

如果是這種情況,我建議你使用gem來增強你的哈希值,讓你的代碼更具可讀性:https://github.com/intridea/hashie。 – Leito 2013-03-13 21:52:19

+0

特別是,Mash(https://github.com/intridea/hashie#mash)查看多級測試的示例,它可能不會比ifs更快,但它會改善您的代碼! – Leito 2013-03-13 21:54:36

-1

內核::加薪可能是值得考慮也

if obj['key']['key2']['name'] 
    name = obj['key']['key2']['name'] 
else 
    raise '' 
end 
+0

您的代碼與OP不一樣。去試試'irb',看看爲什麼。 – 2013-03-13 21:48:43

+0

謝謝加文,我看到OP正在更換,並沒有提出錯誤。我會更多地考慮這一點。 – aug2uag 2013-03-13 21:50:18

4

這個具體的例子,現在可以用Ruby 2.3的實現dig method

name = obj.dig 'key', 'key2', 'name' 

這將安全地訪問obj['key']['key2']['name'],如果任何步驟失敗返回nil。

(一般情況下,它通常建議只使用真實的,未預料到的,錯誤的例外,雖然它是在一個像這樣的例子可以理解的,如果語法使得繁瑣。)

相關問題