訪問(wèn)ruby的hash值,并處理missing data問(wèn)題

類似的情況在《confident ruby》里也有提到過(guò),在使用hash的時(shí)候形成習(xí)慣,就可以避免很多奇怪的問(wèn)題發(fā)生。原文地址

有三種方法可以從一個(gè)hash里得到對(duì)應(yīng)key的值。在文末可以看到這三種方法的一些不同處。

第一種方法,就是大部分ruby開(kāi)發(fā)者都會(huì)用到的#[]。這個(gè)方法是我們最先學(xué)到的從hash里取值的方式。

pets = { cat: "Jess" }
pets[:cat]
# => "Jess"

如果我們想要的值不存在會(huì)發(fā)生什么情況?

pets = { cat: "Jess" }
pets[:dinosaur]
# => nil

現(xiàn)在要處理nil的情況:

pets = { cat: "Jess" }
pets[:dinosaur] || "They all died :("
# => "They all died :("

如果出于某些原因,一些key對(duì)應(yīng)的值被設(shè)置為nil,或者是false,那會(huì)是什么情況?

dinosaurs = { alive?: false }
dinosaurs[:alive?] || true
# => true

如果這個(gè)key在這個(gè)hash里并不存在?我們不會(huì)明確知道這個(gè),除非放一些守護(hù)語(yǔ)句(guard clause)或者一個(gè)異常處理。

第二種方法就是使用#fetch方法。

fetch這個(gè)方法在很多方面跟#[]是一樣的,但會(huì)在key不存在或值為nil時(shí)允許設(shè)置一個(gè)默認(rèn)值。

pets = { cat: "Jess" }
pets.fetch(:dinosaur, "They all died :(")
# => "They all died :("

看上去跟之前一個(gè)沒(méi)太大區(qū)別,再看另一個(gè)例子:

dinosaurs = { alive?: false }
dinosaurs.fetch(:alive?, true)
# => false

#fetch只有在key不存在的情況或者這個(gè)key對(duì)應(yīng)的value值為nil的情況才會(huì)去使用設(shè)置的默認(rèn)值。這里的:alive?值是false,所以不會(huì)返回使用默認(rèn)值。

第三種是第二種的變種。在第二種情況里,#fetch的第二個(gè)參數(shù)在任何 情況下都是會(huì)被執(zhí)行的,這樣有時(shí)會(huì)造成些問(wèn)題。

pets.fetch(:dinosaur, Dinosaur.raise_from_the_dead!)

第二個(gè)參數(shù)會(huì)被執(zhí)行。

可以這樣寫(xiě)來(lái)避免:

pets.fetch(:dinosaur) { Dinosaur.raise_from_the_dead! }

現(xiàn)在就只有在沒(méi)有這個(gè): dinosaur的情況下,才會(huì)執(zhí)行block里的代碼??梢詼p小我們的開(kāi)銷。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容