Ruby 测试数组元素与多个标准

Ruby 测试数组元素与多个标准,ruby,Ruby,我正在尝试创建一个方法complex\u check(n),该方法将执行以下操作: 创建一个从0到n 根据复杂条件检查该数组的每个元素 例如,我有一个0..n中的数组,我想知道数组中哪些元素可以被3整除,哪些元素不能被4整除。我可以通过索引检查单个条件,如odd?,等等,但是有没有一种简洁的方法可以根据多个条件检查每个整数?这是我能想到的最好的方法,我想这就是您正在尝试做的: def complex_check(n) check_array = (0..n).to_a check_a

我正在尝试创建一个方法
complex\u check(n)
,该方法将执行以下操作:

  • 创建一个从
    0
    n
  • 根据复杂条件检查该数组的每个元素

例如,我有一个
0..n
中的数组,我想知道数组中哪些元素可以被3整除,哪些元素不能被4整除。我可以通过索引检查单个条件,如
odd?
,等等,但是有没有一种简洁的方法可以根据多个条件检查每个整数?

这是我能想到的最好的方法,我想这就是您正在尝试做的:

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]

Ruby非常擅长的一件事是通过列表和其他常规数据结构进行处理。包括数组在内的许多事物的通用扩展允许您快速过滤、分割、分块,以及以其他方式完全返工正在处理的数据。通常几处快速的改动就可以完成这项工作

在这种情况下,
select
可用于从0到
n范围内的潜在候选人中筛选出不需要的值:

 def complex_check(n)
   (0..n).select do |v|
      v % 3 == 0 and v % 4 != 0 
   end
 end
这里的关键是使用任何返回逻辑真值的块都将是一个包含元素的信号,否则将其排除。与此相反的是,它是根据相同的原理工作的,只是使用反向逻辑

您还可以动态传入这些筛选器:

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 }
)
然后,您可以使用可重用的小块插入测试。

  • 创建从0到n升序的整数数组
如果没有必要,就不要这样做,这几乎是不可能的。 使用范围或枚举数。它们非常简单:

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]

您还可以内联
(0..n)
以避免创建变量。谢谢DivXZero!太好了!简单,简洁,易于阅读-正是我所寻找的!jhpratt-你介意解释一下“内联”我的范围是什么意思吗?我看不出一种不创建变量的方法,但它听起来很有趣。“检查每个元素…”是模糊的。您希望该方法返回(或打印)什么?例如,您想返回一个介于
0
n
之间的满足所有要求的数字数组吗?请参考,英语句子以大写字母开头。谢谢,塔德曼!我还没有学会“选择”,非常有用!