2016-03-27 7 views
-1

Bellow ist mein erster (und ziemlich alberner Versuch), eine Klasse für den Rubin-Kickstart-Kurs zu erstellen.Wie viele Flaschen Bier an dieser Wand?

In meinem newbish Geist sollte diese Arbeit - aber stattdessen erhalte ich:

rubytest.rb:28:in `<main>': uninitialized constant BeerSong (NameError) 

rb: 28 "def print_song"

Class BeerSong 
attr_accessor :beers 

def initialize(beers) 
beers = 0 if beers < 0 
beers = 99 if beers > 99 
self.beers = beers 
end 


def print_song 
     bottlecount = :beers 

     letters_to_numbers = Hash.new 
     letters_to_numbers = { 
        "Ninety" => 90, 
        "Eighty" => 80, 
        "Seventy" => 70, 
        "Sixty" => 60, 
        "Fifty" => 50, 
        "Fourty" => 40, 
        "Thirty" => 30, 
        "Twenty" => 20, 
        "Nineteen" => 19, 
        "Eightteen" => 18, 
        "Seventeen" => 17, 
        "Sixteen" => 16, 
        "Fifteen" => 15, 
        "Fourteen" => 14, 
        "Thirteen" => 13, 
        "Twelve" => 12, 
        "Eleven" => 11, 
        "Ten" => 10, 
        "nine" => 9, 
        "eight" => 8, 
        "seven" => 7, 
        "six" => 6, 
        "five" => 5, 
        "four" => 4, 
        "three" => 3, 
        "two" => 2, 
        "one" => 1 
     } 

        while bottlecount > 1 
          bottlecount_primerA = bottlecount.to_s 
          bottlecount_primerB = bottlecount_primerA[0].to_i*10 
          bottlecount_primerC = bottlecount_primerA[1].to_i 

           if bottlecount > 19 && bottlecount_primerC != 0 
             bottlecount_tens = letters_to_numbers.key(bottlecount_primerB) 
             bottlecount_singels = letters_to_numbers.key(bottlecount_primerC) 
             bottlecount_text = "#{bottlecount_tens}-#{bottlecount_singels}" 
            elsif bottlecount > 19 && bottlecount_primerC == 0 
             bottlecount_tens = letters_to_numbers.key(bottlecount_primerB) 
             bottlecount_text = "#{bottlecount_tens}" 
            elsif bottlecount > 9 && bottlecount < 20 
             bottlecount_text = letters_to_numbers.key(bottlecount) 
           end 

          puts "#{bottlecount_text} bottles of beer on the wall," 
          puts "#{bottlecount_text} bottles of beer," 
          puts "Take one down, pass it around,"  
          bottlecount -= 1 
        end 
        puts "one bottle of beer on the wall," 
        puts "one bottle of beer," 
        puts "Take one down, pass it around," 
        puts "zero bottles of beer on the wall" 
end 

Bottleman = BeerSong.new (99) 

Bottleman.print_song 

meinen Kopf für eine Weile Kratzen, aber nicht sicher, warum die Klasse nicht gehen will.

+4

In Rubin ist "Klasse" niedriger verkleidet. Sie werden auch Ihre Variable 'Botteman' klein schreiben wollen. Es ist der Gemeinschaftsstandard in Ruby, anstelle von Tabs 2 Leerzeichen für den Einzug zu verwenden. Sie müssen auch nicht 'Hash.new' verwenden, nur um den leeren Hash durch Ihren erzeugten Hash zu ersetzen (' letters_to_numbers = {...} 'erstellt einen anderen Hash für Sie). –

Antwort

3

Nicht nur ist class BeerSong falsch als Class BeerSong eingegeben, aber die Klasse wird nicht ordnungsgemäß durch eine end Anweisung beendet. So versucht Ruby die Definition von BeerSong zu finden, anstatt zu verstehen, dass Sie versuchen, sie zu definieren. Wenn es nicht gefunden wird, wird der nicht initialisierte konstante Fehler zurückgegeben.

Dies ist die Art von Fehler, die Rubyists über korrekte Einrückung religiös, so dass Dinge wie fehlende end Aussagen sind leicht zu sehen.

+1

Das ist die Art von Sache, die Programmierer über Einrückung religiös macht. Sie könnten den gleichen (Art von) Fehler in Java oder C bekommen. –

+2

danke für die Eingabe :) Als ich richtig Einzug machte sah ich das Problem (und in Religion konvertiert) –

Verwandte Themen