我需要找出data[i][j][k]
元素是否存在,但我不知道data[i]
或data[i][j]
本身是否不为nil。
如果我只是data[i][j][k].nil?
,如果data[i]或data[i][j]是nil
,则抛出undefined method [] for nil:NilClass
所以,我现在在用
unless data[i].nil? or data[i][j].nil? or data[i][j][k].nil?
# do something with data[i][j][k]
end
但它有点麻烦。
有没有其他方法可以检查data[i][j][k]
是否存在而没有data[i].nil? or data[i][j].nil? or data[i][j][k].nil?
?
6条答案
按热度按时间t1rydlwq1#
我通常这样做:
6tdlim6h2#
以下是三种不同的选择:
缩短
您可以使用“
!
”而不是.nil?
来稍微缩短它:你可以通过这样做来摆脱重复:
抽象掉这些细节
上面的两个代码片段都很糟糕,我可能不会在代码库中多次编写它们。
一个三维数组看起来很复杂,你不应该在代码中的很多地方直接访问它。你应该考虑用一个合适的名字将它 Package 在一个对象中:
使用hash
然而,最终,我想知道你是否真的需要一个3D数组。另一种更像Ruby的方法来实现这个数据结构是使用哈希并使用i,j,k坐标元组作为键。除非这是一个巨大的结构,并且你需要3D数组的性能特征,我建议在这里看看我的另一个答案:
https://stackoverflow.com/a/20600345/28128
35g0bw713#
新功能“改进”是一个选项:
dphi5xsq4#
你可以稍微缩短到
你也可以使用“andand”gem,它允许你写:
如果你愿意对
Array
进行临时修补,你可以定义一个方法来实现这一点,比如:它可以让你做:
6uxekuva5#
下面的代码允许任意数量的嵌套,并允许数组的元素具有
nil
的值:sgtfey8w6#
可以使用
Array#dig
:如果其中一个索引无效,则返回
nil
。