2016-04-29 5 views
0

Ich lerne Ruby mit 'Learn to Program' von Chris Pine. In Kapitel 10 sollte ich ein Programm schreiben, wo der Benutzer so viele Wörter eingibt, wie er möchte und wenn er fertig ist, kann er einfach Enter auf eine leere Zeile drücken und beenden. Ich kam mit dieser:Eine sortierte Reihe von Benutzereingaben erstellen

puts "Type whatever you want!" 
index = 0 
word = '' 
array = [] 
while word != nil 
    word << gets.chomp 
    array[index] = word 
    index = index + 1 
end 
puts '' 
puts array.sort 

Aber das funktioniert nicht. Was habe ich verpasst? Gibt es eine andere Möglichkeit, word zu definieren, ohne es wiederholen zu müssen?

Antwort

1

Der word hat keinen nil Wert. Es wird eine leere Zeichenfolge sein. Sie müssen also für das überprüfen:

while word != "" 

# or even better 
while !word.empty? 

Auch Sie hinzufügen, alles zu Ihrer word. Wahrscheinlich wollen Sie es zuweisen statt:

word = gets.chomp 

Per Autor Kommentar:

begin 
    # your code here 
end while !word.empty? 

# OR more readable 
begin 
    # your code here 
end until word.empty? 
+0

Ich versuchte mit '! Word.empty?' und jetzt geht es sofort aus, ohne etwas einzugeben. Ich denke das Problem ist mit 'word = ""' am Anfang des Codes. Ich weiß einfach nicht, wie ich diese Variable anders definieren soll. – annabretsko

+0

Verwenden Sie 'Express while' Schleife. Ich füge ein Beispiel zu meiner Antwort hinzu. – Uzbekjon

+0

Dieser hat mir sehr geholfen! Danke! – annabretsko

0

Es scheint, als gäbe es eine einfachere Lösung, wenn ich die Frage richtig bin zu lesen.

Man könnte so etwas tun:

user_input = gets.chomp.split(" ").sort

ex)

Eingang: bananas clementine zebra tree house plane mine

Ausgang: ["bananas", "clementine", "house", "mine", "plane", "tree", "zebra"]

+0

Das OP wollte, dass die Benutzer die Wörter in jeder Zeile eingeben. Ich weiß nicht, wie wichtig das war. –

1

loop verwenden, kann den Code vereinfachen:

a = [] 

loop do 
    input = gets.chomp 
    if input.empty? 
    break 
    else 
    a << input 
    end 
end 

a.sort! 
puts a 
+0

Hinzugefügt a.sort! zu meiner ursprünglichen Antwort. –

1

Hier ist eine einfache Schleife, die Sie gerade für Tritte tun könnte:

arr = [] 
arr << $_.strip until gets =~ /^\s*$/ 
puts arr.sort 

$_ ist eine spezielle Variable, die von STDIN gelesen zur letzten Eingabe auswertet. Also im Grunde liest dies "Call gets und prüfen, ob die Eingabe nur Leerzeichen ist. Wenn es dann aus der Schleife ausbrechen, andernfalls fügen Sie die letzte Eingabe mit Leerzeichen entfernt Wert auf das Array und Schleifen fortsetzen."

Oder noch mehr Spaß, ein Motto:

puts [].tap {|arr| arr << $_.strip until gets =~ /^\s*$/}.sort 

Grundsätzlich gleiche wie oben, außer tap mit der Variable zu initialisieren.

Ihre Fragen beantworten:

Gibt es eine andere Art und Weise ich Wort definieren konnte, ohne sie wiederholen zu müssen?

Verwenden Sie side effects der Zuordnung.In Rubin, wenn Sie eine Variable zuweisen der Rückgabewert dieser Zuordnung ist die zugeordnete Variable, wie in:

irb(main):001:0> (variable = 2) == 2 
=> true 

Die Idee wäre, um die Zuordnung zu setzen in der Ihre Bedingungen geknüpft. Wenn ich etwas in einer verständlichen Schleife schreiben würde, im Gegensatz zu den obigen, würde ich etwas schreiben:

Verwandte Themen