创建红宝石函数以过滤素数

时间:2019-03-15 15:46:23

标签: ruby loops iteration

在下面的示例中,(2..n - 1).all?的确切含义是什么?

def prime?(n)
  if n >=2
    (2..n - 1).all? do |x|
      n % x != 0
    end
  else
    false
  end
end

我知道它会检查数字是否通过true,但我想获得更好的理解。

2 个答案:

答案 0 :(得分:1)

如果n = 10

然后对于2到9(即n-1)之间的每个值x

n%x不能等于零

更多

(2..n-1)range

all?Enumberable中定义的方法,可用于范围

答案 1 :(得分:0)

您可能需要查看Ruby中块的工作方式。当我刚开始的时候,这件事让我感到震惊。您实际上是通过将代码(该块)传递到迭代器中,以通过在迭代器代码中调用yield()来执行该操作。块可以采用2种基本形式:

(2..n - 1).all? do |x|
  n % x != 0
end

等同于

(2..n - 1).all? { |x| n % x != 0 }

一开始可能比较容易理解。在这种情况下,该块为:

{ |x| n % x != 0 }

我们可以通过添加括号使范围明确:

(2..(n - 1)).all? { |x| n % x != 0 }

通过块发送代码的能力使编写迭代器时非常方便。范围#全部?就是这样的迭代器(我相信)。并且您可以发送任何您希望作为测试的代码,以使您希望所有内容都通过(因为我们正在谈论所有内容?-如果我们正在谈论任何内容?它只需要通过一次)。

| x |这是如何通过yield()调用将参数从迭代器代码发送到块中的。在这种情况下,假设范围的当前值由i表示。然后,将通过迭代器中的yield(i)调用来调用send in块。如果您检查代码,则应该看到它。因此,您可以将所需的任何代码放入代码块中:

(2..(n - 1)).all? { |x| (n + x) < 100 }

只要n不会太大,它应该返回true。

我会在那儿停下来。