创建用于过滤素数的ruby函数

问题描述 投票:0回答:2

在下面的例子中,(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,但我想更好地理解。

ruby loops iteration
2个回答
1
投票

如果n = 10

那么对于2到9之间的每个值x(这是n-1)

n%x不得等于零

more

(2..n-1)是一个range

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


0
投票

您可能需要查看块在Ruby中的工作方式。我刚开始时就把它扔给了我。您实际上是通过在迭代器代码中调用yield()来将代码(块)传递给迭代器。块可以采用两种基本形式:

(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)来调用发送的块。如果你检查代码,你应该看到它。所以你可以在块中放入你想要的任何代码:

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

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

我会在那里停下来。

© www.soinside.com 2019 - 2024. All rights reserved.