什么是在Ruby中访问嵌套数组+哈希的更简洁方法?

时间:2017-09-26 15:47:33

标签: ruby

我有以下代码,我觉得可能有一种更清晰的方式来访问我想要的对象:

id = job.args.size > 0 && job.args[0]['arguments'].size > 0 ? job.args[0]['arguments'][0] : nil

2 个答案:

答案 0 :(得分:4)

这是dig的用途:

id = job.args.dig(0, 'arguments', 0)

dig是为Array,Hash和Struct定义的,因此它可以处理大多数类型的嵌套结构。

答案 1 :(得分:4)

如果我们只能看到它的一行,就很难就如何更好地组织代码提出建议!处理这样的混乱对象表明您可能有更广泛的设计问题,可以提高代码质量。然而...

基于以上所述,“快乐情景”是:

job.args == [{"arguments"=>["foo"]}]

即。一个数组,其第一个元素是一个键为'arguments'的哈希,它映射到一个非空数组。这看起来很乱!

但是,您可以将其简化为:

job.args.dig(0, 'arguments', 0)

这是应用Array#dig(注意:还有Hash#dig)来链接方法调用,如果有任何失败,请优雅地回复nil

此答案假设您使用的是 ruby​​版本> = 2.3.0 ,因为这是在语言中添加dig的时间。如果您运行的是旧版本,则还可以使用this gem来反向移植该功能。