在下面的示例中,(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
,但我想获得更好的理解。
答案 0 :(得分:1)
答案 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。
我会在那儿停下来。