2017-01-20 77 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

相關問題