2017-01-20 4 views
0
Warnung

Hier mein Code ist:"bereits initialisiert Konstante"

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 

Ich habe folgende Fehlermeldung:

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

Was ist falsch?

+2

Das ist kein Fehler, das ist eine Warnung. (Es sagt eindeutig: "Warnung".) –

Antwort

5

Konstanten und Variablen

Divisor eine Konstante ist. Sie möchten eine Variable: divisor. Siehe hierzu answer.

Hinweise

  • puts inputNumber + " is a prime!" wird immer dann aufgerufen. Sie können break durch 10 ersetzen oder eine boolesche Variable verwenden.
  • Da Sie mit Zahlen arbeiten, können Sie auch .to_i einmal anrufen, Ihre Berechnung tun, und .to_s nur Ergebnisse angezeigt werden verwenden
  • Sie nur für Faktoren im Bereich überprüfen (2..Math.sqrt(inputNumber))
  • Sie haben noch zu überprüfen zweimal, wenn 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 

Alternative

Eine kürzere Alternative kann mit Enumerable#find geschrieben werden. Es führt den Block mit jedem Element aus, stoppt, sobald der Code im Block einen truthigen Wert zurückgibt, und gibt das Element zurück, für das der Block truthy ist. Wenn kein Element gefunden wird, gibt es 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

Aus Neugier, warum genau passiert das? Sind 'Foo'-Variablen in Ruby verboten? – Smar

+0

In Ruby ist nicht viel verboten. Sie können es tun, aber Sie erhalten eine Warnung. –

+0

@Smar gibt es keine 'Foo' Variable,' Foo' ist definitionsgemäß eine Konstante. – Stefan

Verwandte Themen