我有一个3d数组,我需要检查第二个“维度”的部分已知值。阵列组成的图示如下:
a = [[[1,1], nil]], [[2,3], [4,8]], [[6,1],[9,9]], [[5,7], nil]]]
我需要检查这个数组是否存在包含两个值的数组,第一个我知道确切的内容,但第二个我只知道它要么是nil
,要么是一个包含未知个位数值的2元素数组。在伪代码中我想做的是a.include?([[1,1],*unknown*])
。
也许正则表达式匹配器是这里要走的路(?)。也许类似于;a.include?([[1,1],/\[\d,\d\]||(nil)])
(我想说的是;[任何单个0-9数字,任何单个0-9数字]或“nil”)
任何帮助感激不尽。
2条答案
按热度按时间jum4pzuy1#
根据我的理解,问题如下:“给定一个包含两个元素的数组,确定是否至少有一个元素是这样的,它的第一个元素等于给定的两个元素数组,第二个元素等于nil或由两个个位自然数组成的数组”。
可以使用以下方法确定给定数组是否具有该属性。
查看Enumerable#any的版本?以一个模式作为参数。(其他接受模式作为参数的
Enumerable
方法是Enumerable#all?,Enumerable#one?可枚举的#none?).ppcbkaq52#
虽然“查找模式”仍处于试验阶段,但您的用例非常适合Pattern matching
例如:
该模式是相当自我解释的,但它分解为
a[0] == known
和a[1] == nil
或a[1]
是0和9之间的任何2个整数数值(包括Integer
,Float
等)的数组。如果你想允许任何整数,你可以用[Integer,Integer]
替换[0..9,0..9]
。如果您根本不关心a[1]
是什么,那么您可以使用*
(它与您建议的[[1,1],*unknown*]
模式相当接近)两侧的
[*,...,*]
是实验性的“查找模式”部分。本质上,它只是意味着在arr
中的任何地方找到这个模式(第一个匹配获胜)。另一个注意事项是
^known
,因为模式匹配允许在没有插入符号(^
)的情况下进行变量绑定,变量known
将被分配模式中第一个元素(a[0][0]
)的值。^
“固定”本地变量known
或如文档中所述 “对于这种情况,可以使用pin运算符^
,以告诉Ruby '只需将此值用作模式的一部分'”感谢@steenslag指出Find Pattern不再是实验性的
更新为了涵盖@CarySwoveland指出的情况(
[[8,8],[1,4.6]]
),需要将其更改为:其中
Integer
和nil
检查被分开,因为变量绑定不适用于备用表达式(用|
分隔)