2017-01-20 9 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!"は常に呼ばれています。
  • breakexitに置き換えるか、ブール変数を使用できます。
  • あなたは数字で動作するので、あなたも、一度.to_iを呼び出して、あなたの計算を行うには、ちょうどあなたが唯一のあなたがする必要はありません範囲(2..Math.sqrt(inputNumber))
  • 要因をチェックしなければならない結果
  • を表示するために.to_sを使用することができます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

好奇心の疎外で、なぜこれがどうして起こりますか? 'Foo'変数はRubyで禁止されていますか? – Smar

+0

Rubyではあまり禁止されていません。あなたはそれをすることができますが、あなたは警告を受け取ります。 –

+0

@Smar 'Foo'変数はありません、' Foo'は定義では定数です。 – Stefan