2009-04-11 10 views
1

Also mache ich ein kleines, einfaches Projekt für meine Klasse und aus irgendeinem Grund kann ich nicht auf einen Wert zugreifen, der eine Variable verwendet.Ruby-Arrays - kann nicht auf Wert zugreifen

Das ist meine Klasse: (ich Probleme mit der getAnswer Methode habe, insbesondere die answerArray Array)

#Create random fact array 
class RandomFact 
    def initialize() 
     @randomNum = rand(5) 
    end 

    def getQuestion 
     randomNum = @randomNum 
     questionArray = Array.new 
     questionArray[0] = "Do you liek mudkipz?" 
     questionArray[1] = "Question2" 
     questionArray[2] = "Three" 
     questionArray[3] = "Reddit" 
     questionArray[4] = "4chan" 

     puts questionArray[randomNum] 
     return randomNum 
    end 

    def getAnswer(randomNum,answer) 
     answerArray = Array.new 
     answerArray[0] = "one" 
     answerArray[1] = "two" 
     answerArray[2] = "three" 
     answerArray[3] = "four" 
     answerArray[4] = "five" 

     return answerArray[randomNum] 
    end 

end 

Das ist meine Klasse der Klasse ist:

randomNum = cgi['randomNum'] 
    answer = cgi['answer'] 
    puts newQuestion.getAnswer(randomNum,answer) 

Nun ist die Sache ist, dass randomNum einen Wert aus einem vorherigen Formular enthält. Wenn ich RandomNum direkt darunter ausdrücke, wo ich den Wert aus dem Formular heraushole, bekomme ich es.
Wenn ich randomNum innerhalb der Methode getAnswer drucke ich bekomme es.
Wenn ich AntwortArray [0] drucke, erhalte ich einen Wert.
Wenn ich antwortArray [randomNum] ausdrucken bekomme ich nichts.



Es ist so ziemlich eine exakte Kopie der Methode getQuestion von oben und das funktioniert. Irgendwelche Eingaben?

+0

Sie ein 'p randomNum' und' p answer' so können wir Details über randomNum und Antwort sehen. FYI 'p obj' ist das Äquivalent von' puts obj.inspect' - es gibt mehr Informationen als 'puts obj.to_s' und ist generell besser zum Debuggen. – rampion

Antwort

1

Die Zufallszahl wird wahrscheinlich als Zeichenfolge von Ihrem CGI kommen. Wirf es mit randomNum.to_i in eine ganze Zahl und du wirst eingestellt.

+0

Nein, ich hatte versucht, es früher mit int() zu ändern. Ich habe es nur versucht, und das hat auch nicht funktioniert. – Levi

0

Es muss Ihre Eingabe sein. Als ich es in irb versuchte, funktionierte es für mich.

>> new_q = RandomFact.new 
=> #<RandomFact:0x41028e74 @randomNum=2> 
>> new_q.getQuestion 
Three 
=> 2 
>> new_q.getAnswer(2, "") 
=> "three" 
+0

Ich weiß es ist mein Input, ich weiß einfach nicht, was damit nicht stimmt. Ich habe versucht, die Eingabe zu konvertieren, um sicherzustellen, dass es ein Int ist und es immer noch nicht funktioniert. Die Eingabe ist aber da, ich kann es ausdrucken Ich kann es nur nicht in Verbindung mit dem Array aus irgendeinem Grund verwenden. – Levi

0

Ich bin nicht sicher, was Sie wirklich hier zu tun versuchen, aber wenn Sie wirklich nur versuchen zu tun, was Ihr Beispiel zeigt, dann brauchen Sie keine Klassen und Funktionen zu schaffen werden. Eine einzige Reihe von Fragen und Antworten würde großartig funktionieren.

QA = [ 
    ["What is the capital of Estonia?","Tallinn"], 
    ["How many times to 6 go into 18?","3"], 
    ["What have I got in my pocket?","The Ring"] 
] 

qnum = cgi["qnum"].to_i 
question = QA[qnum].first 
answer = QA[qnum].last 
+0

Es ist für eine Klasse, die ich auf Ruby nehme, also müssen wir den langen Weg herum nehmen, um etwas über die Sprache zu lernen. Aber ja, das wäre ein idealer Weg, dies zu tun. – Levi

0

Initialisieren Sie newQuestion irgendwo? In dem Beispiel, das Sie angegeben haben, wird es null sein.

Ein paar nicht relevant-zu-der-Frage-Leckerbissen: Sie brauchen nicht die Return-Anweisung. Ruby gibt immer den letzten Wert zurück. Stellen Sie den Wert einfach selbst ein. Und in Ruby ist es üblich, dass Sie Ihre Variablen als new_question, nicht als newQuestion schreiben.

+0

Ja, ich initiiere es direkt nach meiner Print-Content-Zeile, es ist einfach nicht im obigen Beispiel. Ich habe bemerkt, dass mein Lehrer die Variablen so geschrieben hat. Gibt es einen Grund warum? – Levi

+0

Welche Print-Content-Zeile? Du meinst nach den Puts? Wenn ja, dann wird das natürlich nicht funktionieren. Schreiben Variablen auf diese Weise funktioniert, es geht nur gegen die Ruby-Konvention. Wenn Sie die fehlenden Teile Ihres Codes hinzufügen, erhalten Sie wahrscheinlich eine bessere Antwort. – user37011

+0

was bekommst du für antwortArray [randomNum.to_i]? – user37011

0

Es gibt eine Reihe von Dingen in Ihrem Code, die ziemlich unregelmäßig aussehen.

Das Beschreiben der Fragen und Antworten in zwei separaten Arrays ist ein Problem, egal wie Sie es schneiden. Es ist besser, sie in einer einfachen, konsistenten Array-Anordnung zu definieren und dann eines dieser Elemente mit der integrierten Methode Array # rand auszuwählen, die zufällig eine davon auswählt.

Zum Beispiel


    class RandomFact 
    QUESTIONS = [ 
     [ 'How many nuts can a squirrel eat?', '2' ], 
     [ 'What is my favorite color?', 'blue' ] 
    ] 

    def self.rand 
     QUESTIONS.rand 
    end 
    end 

    (question, answer) = RandomFact.rand 

    puts "Question: #{question}" 
    puts "Answer: #{answer}" 

+0

Auf welche Ruby-Version beziehen Sie sich? Weder Ruby 1.8.6, noch 1.8.7, noch 1.9.1 hat Array # rand. Ruby 1.9.1 hat Array # sample, was macht was Sie wollen, aber keine Array # rand. –

+0

Dies muss eine der Kernerweiterungen von Rails sein, die ich vergessen habe, war Teil dieses Pakets. Danke für die Klarstellung. – tadman

Verwandte Themen