2009-04-11 6 views
1

私はクラスのための小さくてシンプルなプロジェクトをやっています。何らかの理由で変数を使って値にアクセスできません。Rubyの配列 - 値にアクセスできない

これが私のクラスである:

#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 

(私はgetAnswer方法の問題点、特にanswerArray配列が生じています)これはクラスに私のクラスである:今

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

事randomNumは以前のフォームの値を保持しているということです。フォームから値を取得する場所の下にrandomNumを表示すると、私はそれを取得します。
私はメソッドgetAnswerの中にrandomNumを出力していれば取得できます。
answerArray [0]を印刷すると値が得られます。
answerArray [randomNum]を印刷しても何も得られません。



これは、上記のgetQuestionメソッドの正確なコピーであり、1つは機能します。どんな入力?

+0

我々はrandomNumと答えの詳細を見ることができるように 'のp randomNum'と'のp answer'を行います。 FYI 'p obj'は' puts obj.inspect'に相当します - 'puts obj.to_s'よりも多くの情報を提供し、一般的にはデバッグにもっと便利です。 – rampion

答えて

1

乱数はおそらくCGIから文字列として入力されています。 randomNum.to_iを使用して整数にキャストすると、設定されます。

+0

いいえ、私は以前int()を使って変更しようとしました。私はちょうどto_iを試みたが、それはどちらもうまくいかなかった。 – Levi

0

あなたの入力でなければなりません。私はirbで試してみると、それは私のために働いた。

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

私は自分の入力を知っている、私はちょうどそれが間違っているか分からない。入力をint型に変換しようとしましたが、それはまだ動作しません。入力はそこにある、私はそれを印刷することができます私はちょうど何らかの理由で配列と一緒に使用することはできません。 – Levi

0

私はあなたが本当にここで何をしようとしてわからないんだけど、あなたが本当にあなただけの例が示す何をしようとしている場合は、クラスや関数を作成する必要はありません。 1つの質問と回答の配列が素晴らしいと思います。

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

それは私がRubyを習っているクラスのため、私たちは言語について学ぶために遠く離れていなければなりません。しかし、ええ、そうするのが理想的な方法です。 – Levi

0

newQuestionをどこかで初期化していますか?あなたが与えた例では、それはゼロになります。

質問には関係のない質問がいくつかあります。返信文は必要ありません。 Rubyは常に最後の値を返します。そこに価値を置くだけです。 Rubyでは、newQuestionではなくnew_questionとして変数を記述するのが標準的な方法です。

+0

はい私は印刷コンテンツの行の直後にそれを開始しますが、これは上記の例には該当しません。私は先生がそのような変数を書いていることに気付きました。理由は何ですか? – Levi

+0

印刷内容の行は何ですか?あなたは置いた後のことを意味しますか?もしそうなら、それはもちろん動作しません。そのように変数を書くことは、Rubyの規約に反するだけです。 コードの欠落部分を含めると、より良い回答が得られる可能性が高くなります。 – user37011

+0

answerArray [randomNum.to_i]には何がありますか? – user37011

0

コードにはかなり不規則に見えるものが数多くあります。

2つの別々のアレイで質問と回答を記述することは、どのようにスライスしても問題はありません。より良い方法は、シンプルで一貫性のある配列の配列でそれらを定義し、その中の1つを無作為に選択する組み込みのArray#randメソッドを使用してそれらの要素の1つを選択することです。例えば


    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

あなたはどちらのバージョンのRubyを参照していますか? Ruby 1.8.6も1.8.7も1.9.1にもArray#randはありません。 Ruby 1.9.1にはArray#sampleがあります。これはあなたが望むことをしますが、Array#randはありません。 –

+0

これは私が忘れてしまったRailsのコア拡張の1つでなければなりません。説明をありがとう。 – tadman

関連する問題