所以我一直在尝试创建一个方法,为你作为参数插入的任何Integer显示一个素数数组,但是我得到了最奇怪的错误。任何人都可以解释这个错误意味着什么以及如何使用任何宝石来解决我的问题?我已经尝试过了Stack Overflow并且没有找到解决方案。谢谢!
def prime_factors(num, output = [])
factor = (2..num-1).find(0){|divisor| num % divisor == 0} #returns nil if find fails.
output << factor if factor != 0
prime_factors(num/factor, output)
end
prime_factors(5)
我收到的错误是:
`find': undefined method `call' for 0:Fixnum (NoMethodError)
in `prime_factors'
in `<main>'
答案 0 :(得分:0)
查看Enumerable#find
的文档(您在函数的第一行调用:http://ruby-doc.org/core-1.9.3/Enumerable.html#method-i-find
如果find
(在您的情况下为Enumerable
)的对象匹配(即,给定的块始终返回(2..num-1)
),则调用false
的参数。因此,find
会尝试查找num % divisor
等于0
的数字,但找不到。{1}}。然后,它调用作为参数提供的函数。您为该参数传递0
。因此它尝试将0
作为一个函数调用(通过执行call
方法:0.call
)来完成。但是0
类的Fixnum
没有这样的方法(它不是函数而是数字)。这会生成错误消息。
答案 1 :(得分:0)
你得到的错误是因为下面一行中的find(0)
factor = (2..num-1).find(0)
因为find方法无法触发“0即fixnum”的调用作为参数。 我不知道你为什么这样做。
相反,你可以试试这个逻辑
(2..num-1).each do |i|
is_prime = true
(2..Math.sqrt(i)).each { |j| is_prime = false if i % j == 0 }
output << i if is_prime
end