访问ruby的hash值,并处理missing data问题

类似的情况在《confident ruby》里也有提到过,在使用hash的时候形成习惯,就可以避免很多奇怪的问题发生。原文地址

有三种方法可以从一个hash里得到对应key的值。在文末可以看到这三种方法的一些不同处。

第一种方法,就是大部分ruby开发者都会用到的#[]。这个方法是我们最先学到的从hash里取值的方式。

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

如果我们想要的值不存在会发生什么情况?

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

现在要处理nil的情况:

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

如果出于某些原因,一些key对应的值被设置为nil,或者是false,那会是什么情况?

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

如果这个key在这个hash里并不存在?我们不会明确知道这个,除非放一些守护语句(guard clause)或者一个异常处理。

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

fetch这个方法在很多方面跟#[]是一样的,但会在key不存在或值为nil时允许设置一个默认值。

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

看上去跟之前一个没太大区别,再看另一个例子:

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

#fetch只有在key不存在的情况或者这个key对应的value值为nil的情况才会去使用设置的默认值。这里的:alive?值是false,所以不会返回使用默认值。

第三种是第二种的变种。在第二种情况里,#fetch的第二个参数在任何 情况下都是会被执行的,这样有时会造成些问题。

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

第二个参数会被执行。

可以这样写来避免:

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

现在就只有在没有这个: dinosaur的情况下,才会执行block里的代码。可以减小我们的开销。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容