2017-01-20 74 views
0

这里是我的代码:“已初始化常数” 警告

puts "Input a number." 
Divisor = 2 
inputNumber = gets.chomp 
if inputNumber.to_i == 1 || inputNumber.to_i == 2 
    if inputNumber.to_i == 1 
    puts inputNumber + " is not a prime." 
    else 
    puts inputNumber + " is a prime." 
    end 
else 
    while Divisor.to_i < inputNumber.to_i 
    if inputNumber.to_i%Divisor.to_i == 0 
     puts inputNumber + " is not a Prime as " + Divisor.to_s + " is a factor." 
     break 
    else 
     Divisor = Divisor.to_i + 1 
    end 
    end 
    puts inputNumber + " is a prime!" 
end 

我得到了以下错误:

test1.rb:30: warning: already initialized constant Divisor 
test1.rb:3: warning: previous definition of Divisor was here 

有什么不对?

+2

这不是错误,那是一个警告。 (它清楚地这样说:“警告”。) –

回答

5

常数和变量

Divisor是一个常数。你想要一个变量:divisor。看到这个answer

  • puts inputNumber + " is a prime!"总是被调用。
  • 您可以用exit代替break,或使用布尔变量。
  • 既然你用数字的工作,你也可以叫.to_i一次,做你的计算,只需使用.to_s显示结果
  • 你只需要检查的因素范围(2..Math.sqrt(inputNumber))
  • 您不必检查两次inputNumber == 1

puts 'Input a number.' 
divisor = 2 
inputNumber = gets.chomp.to_i 
prime = true 
if inputNumber == 1 
    puts inputNumber.to_s + ' is not a prime.' 
else 
    while divisor <= Math.sqrt(inputNumber) 
    if inputNumber % divisor == 0 
     puts inputNumber.to_s + ' is not a Prime as ' + divisor.to_s + ' is a factor.' 
     prime = false 
     break 
    else 
     divisor += 1 
    end 
    end 
    puts inputNumber.to_s + ' is a prime!' if prime 
end 

替代

Enumerable#find可以写出更短的替代方案。它用每个元素执行块,一旦块中的代码返回一个真值,就立即停止,并返回该块所在的元素。如果找不到元素,则返回nil

puts 'Input a number.' 

number = gets.chomp.to_i 

divisor = (2..Math.sqrt(number)).find { |i| number % i == 0 } 

if number == 1 
    puts '1 is not a prime.' 
elsif divisor 
    puts format('%d is not a prime as %d is a factor.', number, divisor) 
else 
    puts format('%d is a prime!', number) 
end 
+0

出于好奇,为什么会发生这种情况? Ruby中禁止'Foo'变量? – Smar

+0

在Ruby中禁止使用太多。你可以做到,但你会收到警告。 –

+0

@Smar没有'Foo'变量,'Foo'就是一个常量。 – Stefan

相关问题