2016-06-22 4 views
-1

Ich habe vor kurzem angefangen, Ruby zu lernen, aus einem Hintergrund in Python kommen. Dies ist eines meiner ersten Programme über ein paar Zeilen Länge, und ich habe irgendwo in der Syntax einen Fehler gemacht, den ich nicht abfangen kann, was dazu führt, dass das Programm mit dem Fehler "unerwartetes Ende der Ausgabe, erwartetes Schlüsselwort_end" fehlschlägt.Keine Ausgabe von Ruby-Programm

Hier ist der Code, vielen Dank für jede Hilfe! Es ist ein Programm, das Zahlen von Ziffernform in Englisch umwandelt.

def toEnglish number 
     if number < 0 
       return 'Please try again, negative numbers are not allowed' 
     end 
     if number == 0 
       return 'Zero' 
     end 
     if number > 0 
       numEnglish = '' 
       left = number.to_s.size 
       ones = ['one', 'two', 'three', 'four', 'five', 'six', 'seven', 
        'eight', 'nine'] 
       tens = ['ten', 'twenty', 'thirty', 'forty', 'fifty', 'sixty', 
        'seventy', 'eighty', 'ninety'] 
       teens = ['eleven', 'twelve', 'thirteen', 'fourteen', 'fifteen', 
        'sixteen', 'seventeen', 'eighteen', 'nineteen'] 
       while left.to_i > 0 
         firstDigit = number.to_s[0].to_i 
         secondDigit = number.to_s[1].to_i 
         sum = (firstDigit.to_i * 10) + secondDigit.to_i 
         if secondDigit != 0 
           if sum < 20 and sum > 10 
             numEnglish << teens[sum.to_i - 11] + 
            'hundred' 
           elsif (sum % 10) == 0 
             numEnglish << tens[(sum.to_i/10)].to_s + 
            'hundred' 
           else 
             numEnglish << tens[(firstDigit.to_i/
            10) - 1] + ones[secondDigit - 1] 
           end 
         end 
           numEnglish << ones[firstDigit.to_i - 1] 
         numberRev = number.to_s.reverse 
         number = (numberRev.to_i/100).to_s.reverse 
       end 
       if left == 0 
         return numEnglish 
       end 
     end 
end 

puts toEnglish(54) 
puts toEnglish(447) 

Im Moment wird der Code ohne Fehler, aber ich bin mit einem blinkenden Cursor wie links ich aus dem gets Verfahren erhalten würde.

+0

Was ist der Fehler, den Sie erhalten und auf welche Zeile (n) verwiesen wird? –

+0

Es ist normalerweise besser, große, unveränderliche Arrays wie "Einsen", "Zehner" und "Teenager" als Konstanten außerhalb Ihrer Methode zu deklarieren. Zum Beispiel: "ONES", "TENS" und "TEENS" mit den gleichen Definitionen. Sie können auch Unterstützung für negative Werte hinzufügen wie: 'return 'negative' + toNumber (-number)'. Es sollte hier erwähnt werden, dass Methodennamen wie 'to_number' sein sollten, um den Ruby-Codierungskonventionen zu folgen. – tadman

+0

Willkommen bei Ruby. Seien Sie sich bewusst, dass Sie Ruby-Code wie Python schreiben, der in einer Teameinstellung nie gut läuft oder wenn Sie Ihren Code teilen möchten. Es gibt Ruby Style Guides, die Ihnen helfen werden, Ihren Code in eine Linie zu bringen. –

Antwort

2

Ein end nach Linie fehlt 35, dh bei

     number = (numberRev/100).reverse 
       # HERE! there should be an `end` 
       if left == 0 
         return numEnglish 

Zusätzlich in Zeile 18 und 19 Sie number[0] zur ersten Nicht-Ziffer Null Integer fragen, während the class kein Mitglied hat #[]#[] in beiden Bignum und Fixnum nicht tun, was du meinst. Versuchen Sie etwas anderes, zum Beispiel number.to_s[0].to_i.

Hinweis: Es wird allgemein akzeptiert, mit zwei Leerzeichen einzurücken, nicht acht.

+2

Klarstellung: Die Codierungskonventionen von Ruby unterstützen stark zwei Bereiche. Andere Sprachen haben andere widersprüchliche Stile. – tadman

+1

Danke für die Hilfe! Ich habe das behoben und ein ähnliches Problem mit dem Umkehrcode. Nun, aus irgendeinem Grunde, wenn ich den Code ausführen bekomme ich einen blinkenden Cursor ähnlich den aus dem „bekommt“ Befehl, und der Code nicht beendet. Irgendwelche Ideen? Danke für die Hilfe trotzdem! In Bezug auf die Einrückung, acht ist genau das, was mein VIM eingestellt wurde, werde ich das ändern, danke! – LMCMLJ

+1

@LMCMLJ Vielleicht, weil die Schleife nicht brechen? Versuchen Sie, etwas wie "puts" looping "' in die Schleife einzufügen. –

0

Einige Ratschläge:

  • Verwendung zwei Räume. Es ist häufiger und einfacher zu lesen und solche Fehler zu erkennen.
  • Verwenden Sie einen Editor wie Sublime Text oder eine IDE wie RubyMine. ST verfügt über mehrere Add-Ons, die das Debuggen erleichtern. In diesem Fall musste ich nur einen "Beautify-Ruby" auf dem Code ausführen und es gab mir diese Ausgabe.

Es sieht aus wie Sie eine end irgendwo vermissen. Ich bin mir nicht sicher, wo, weil es auch andere Fehler gibt, wie z. B. Zeile 20 und 34. Aber selbst nach der Behebung dieser Fehler läuft der Code für immer.

Der Code ist sicherlich nicht Ruby-like, es gibt viel bessere Contructs zu verwenden.

Zum Beispiel ist die Schleife, wo man nicht verlassen kann, ein while selten verwendet wird, eher verwenden, um ein each oder etwas ähnliches:

def toEnglish number 
    if number < 0 
    return 'Please try again, negative numbers are not allowed' 
    end 
    if number == 0 
    return 'Zero' 
    end 
    if number > 0 
    numEnglish = '' 
    left = number.to_s.size 
    ones = ['one', 'two', 'three', 'four', 'five', 'six', 'seven', 
      'eight', 'nine'] 
    tens = ['ten', 'twenty', 'thirty', 'forty', 'fifty', 'sixty', 
      'seventy', 'eighty', 'ninety'] 
    teens = ['eleven', 'twelve', 'thirteen', 'fourteen', 'fifteen', 
      'sixteen', 'seventeen', 'eighteen', 'nineteen'] 
    while left.to_i > 0 
     firstDigit = number[0] 
     secondDigit = number[1] 
     sum = (firstDigit.to_i * 10) + secondDigit+to_i 
     if secondDigit != 0 
     if sum < 20 and sum > 10 
      numEnglish << teens[sum.to_i - 11] + 
      'hundred' 
     elsif (sum % 10) == 0 
      numEnglish << tens[(sum.to_i/10)].to_s + 
      'hundred' 
     else 
      numEnglish << tens[(firstDigit.to_i/
           10) - 1] + ones[secondDigit - 1] 
     end 
     end 
     numEnglish << ones[firstDigit.to_i - 1] 
     numberRev = number.reverse 
     number = (numberRev/100).reverse 
     if left == 0 
     return numEnglish 
     end 
    end 
    end 

    puts toEnglish(54) 
    puts toEnglish(447) 

Ich verstehe diese Übung Ruby zu lernen, weil es bereits Edelsteine ​​sind das mache diese Umwandlung für dich. Siehe auch "Using Ruby convert numbers to words?".