Ruby中如何优雅检查数组内容是否匹配部分已知值?
解决3D数组的条件匹配问题
首先纠正你给出的数组语法错误,正确的数组定义应该是:
a = [[[1,1], nil], [[2,3], [4,8]], [[6,1],[9,9]], [[5,7], nil]]
Array#include?方法是严格相等匹配,不能直接用正则表达式作为匹配条件,你需要用any?方法遍历数组,对每个元素做条件判断。
实现代码
如果你需要匹配的是「第一个子元素为[1,1],第二个子元素要么是nil,要么是包含两个整数的数组」,可以这么写:
a = [[[1,1], nil], [[2,3], [4,8]], [[6,1],[9,9]], [[5,7], nil]] has_target = a.any? do |elem| # 第一个子元素严格匹配[1,1] elem.first == [1,1] && # 第二个子元素是nil,或包含两个整数的数组 (elem.second.nil? || (elem.second.is_a?(Array) && elem.second.size == 2 && elem.second.all? { |num| num.is_a?(Integer) })) end puts has_target # 输出 true,因为数组第一个元素符合条件
如果你的「未知单个数字」特指0-9的一位数,可以把整数判断的部分改成:
elem.second.all? { |num| num.is_a?(Integer) && num.between?(0, 9) }
为什么正则方法不可行?
include?要求元素与参数完全相等,正则表达式是独立的对象,和数组中的nil或子数组不可能相等,因此无法通过这种方式实现匹配。必须通过遍历+条件判断的方式,逐个验证元素是否符合规则。
内容的提问来源于stack exchange,提问作者jbk
相关产品推荐
相关产品推荐

