【问题标题】:Creating a ruby function for filtering prime numbers创建用于过滤素数的 ruby​​ 函数
【发布时间】:2019-08-06 17:56:51
【问题描述】:

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

【问题讨论】:

  • 另外,Prime::prime? 方法可能很有趣。源代码是用纯 ruby​​ 编写的,因此您可以看到核心团队是如何做到这一点的。
  • 哪个部分特别令人困惑?全部?你可以查一下,...是一个范围。

标签: ruby loops iteration


【解决方案1】:

如果 n = 10

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

n % x 不能等于零

更多

(2..n-1)range

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

【讨论】:

    【解决方案2】:

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

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

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

    我会停在那里。

    【讨论】:

      猜你喜欢
      • 2011-12-31
      • 1970-01-01
      • 1970-01-01
      • 2022-12-01
      • 2016-05-31
      • 2022-11-14
      • 1970-01-01
      • 2019-06-07
      • 2022-01-09
      相关资源
      最近更新 更多