我正在尝试创建一个方法complex_check(n)
,它将执行以下操作:
0
升级到n
例如,我有一个来自0..n
的数组,我想知道数组的哪些元素都可以被3整除,而不能被4整除。我可以索引来检查单个条件,如{ {1}}等,但有一种紧凑的方法可以根据多个条件检查每个整数吗?
答案 0 :(得分:2)
这是我能想到的最好的,我认为这是你正在尝试做的事情:
def complex_check(n)
check_array = (0..n).to_a
check_array.select { |num|
num % 3 == 0 &&
num % 4 != 0
}
end
然后使用它:
complex_check(15)
=> [3, 6, 9, 15]
答案 1 :(得分:2)
Ruby非常擅长的一件事是处理列表和其他常规数据结构。包括Array在内的许多常见的Enumerable扩展允许您快速过滤,拆分,分块,以及完全重写您正在处理的数据。通常可以做一些快速改动。
在这种情况下,select
可用于过滤0到n
范围内潜在候选人的不良值:
def complex_check(n)
(0..n).select do |v|
v % 3 == 0 and v % 4 != 0
end
end
这里的关键是使用select
,其中任何返回逻辑真值的块都将是包含该元素的信号,否则将其排除。与此相反的是reject
,其工作原理相同,只是反转逻辑。
您还可以动态传递这些过滤器:
def complex_check(n, *tests)
tests.each_with_object((0..n).to_a) do |test, a|
a.select!(&test)
end
end
您的测试代码最终看起来像这样:
complex_check(
50,
-> (v) { v % 3 == 0 },
-> (v) { v % 4 != 0 }
)
然后,您可以使用lambdas插入测试,这些是可重复使用的块。
答案 2 :(得分:0)
0.upto(n).select do |i| #0.upto(n) results in a Enumerator
#complex criteria
end
#or
def complex_check(n)
0.step(n,3).reject{|n| (n%4).zero?} #0.step(n,3) is an Enumerator
end
p complex_check(15) #= [3, 6, 9, 15]