2016-08-07 270 views
0

返回不同的布尔值我已经写以下函数来检查一个数是否为素数:红宝石功能在IRB VS repl.it

def is_prime?(number) 
    arr = (2..number).to_a.select {|m| number % m == 0} 
    arr.length == 1 ? true : false 
end 

当通过4或9在IRB的数目,它正确返回假。但是,在repl.it这些评估为真。

这里是测试代码,我在repl.it运行:

puts("\nTests for #is_prime?") 
puts("===============================================") 
puts('is_prime?(2) == true: ' + (is_prime?(2) == true).to_s) 
puts('is_prime?(3) == true: ' + (is_prime?(3) == true).to_s) 
puts('is_prime?(4) == false: ' + (is_prime?(4) == false).to_s) 
puts('is_prime?(9) == false: ' + (is_prime?(9) == false).to_s) 
puts("===============================================") 

,其输出:

Tests for #is_prime? 
=============================================== 
is_prime?(2) == true: true 
is_prime?(3) == true: true 
is_prime?(4) == false: true 
is_prime?(9) == false: true 
=============================================== 
What could be causing this variation? 
+0

你能“分享”你的repl.it会话吗?这是我所看到的。 https://repl.it/Ck9M/0 – kcdragon

+0

以下是我的repl.it会话的链接: https://repl.it/Br7y/452 – John

+0

您的repl按预期工作。即使4和9评估为真,那是因为你检查他们是错误的。 false == false是真的 – kcdragon

回答

2

我试着repl.it和我假两个4和9

无论如何,你的代码有两点小小的改进: - 你可以直接调用select的范围,而不用把它放在数组中 - 你可以返回表达式的值本身,而不指定真假

def is_prime?(number) 
    arr = (2..number).select {|m| number % m == 0} 
    arr.length == 1 
end 
0

您已经通过测试的输出,这是报告这两个函数的预期结果混淆,以及功能的alctual结果是正确的(即是测试所预期的):

is_prime?(2) == true: true 
is_prime?(3) == true: true 
is_prime?(4) == false: true 
is_prime?(9) == false: true 
       ^ ^
        |  | 
        |  true if the test passed; false if failed 
        | 
        What the function should have returned 

如果最右边一列包含了所有“真”值,则该功能已通过所有的测试。