在下面的例子中,(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中的工作方式。我刚开始时就把它扔给了我。您实际上是通过在迭代器代码中调用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。
我会在那里停下来。