2017-12-07 8 views
-1
class Test 

    def self.take_test(question, options, answer) 
    puts question 
    options.each_with_index { |option, idx| puts "#{ idx + 1 }: #{ option}" } 
    print "Answer: " 
    reply = gets.to_i 
    if answer == reply 
     puts "Correct!" 
    else 
     puts "Wrong. The answer is: " + answer.to_s 
    end 
    end 
end 

file = File.open("Matematik.txt", "r") 

この私がしようとしたものです:どのように私は、テキストがあるとおりに、TXTの行を読んで、ルビーのための方法でそれらを使用していますか?

IO.foreach("Matematik.txt") { |line| Test.take_test(line) } 

これは質問がファイルに設定されている方法です: '?2 + 2である何

、[ '2' は、 '3'、 '4'、 '5'、]、4

'3 + 3は何ですか?'、[ '3'、 '6'、 '9'、]、6

私が手エラー:指定された引数のtake_test間違った数(1を与え、3期待される)(例外ArgumentError)

それは1つの引数のような行を読み込むように思えます。これはeval("Test.take_test(#{line})")で、はい、理論的には

#Test.take_test('What is 2+2?', [ '2', '3', '4', '5', ], 4) 

答えて

1

を?:ように私が立っているとおりに正確にラインを読むための方法、および入力それはあります。しかし、evalは悪であり、可能な限り避けるべきです。

あなたは簡単にそれを分解することができますので、あなたのファイル形式を変更した場合はそれがはるかに容易になるだろう。 (それはあなたの形式と不可能ないが、それは単純なフォーマットと比較すると、ちょうどあなたが、不必要な作業の多くを持っているのです。)例えば、CSVのようにフォーマットされた行与えられた:

"What is 2+2?",2,3,4,5,4 

それは非常に簡単です

require 'csv' 

Question = Struct.new(:text, :options, :answer) 

questions = CSV.read("Mathematik.csv").map { |text, *options, answer| 
    Question.new(text, options, answer.to_i) 
} 

questions[0].text 
# => "What is 3+3?" 

questions[0].options 
# => ["2", "3", "4", "5"] 

questions[0].answer 
# => 4 
+0

ありがとう:次の手順を実行します! evalを使用すると何が問題になりますか?これまでのところ私の問題は解決しました。あなたはデータがから来ている場所を正確に知っている限りeval'は、任意のコードの実行が可能になります '以来 –

+0

主な関心事は、セキュリティです。例えば、誰かがこの行をあなたのプログラムに入れたとしましょう: '' ['cat/etc/passwd'、[" Haha "、" What "、" acker! "]、0]' ';質問を表示する時間が来ると、ユーザーにパスワードファイルが表示されます。データがどこから来ているのか分かっていても、 'eval'はRubyのメソッドキャッシュを殺し、コードを遅くします。しかし、主にセキュリティ:「eval」を使用しないように自分自身を訓練すれば、誤って安全に使用するように誘惑することはできません。 – Amadan

+0

明らかに、「evalは悪です」とは誇張された過度の簡略化ですが、[ここ](https://softwareengineering.stackexchange.com/questions/311507/why-are-eval-like-features-considered-evilin - コントラスト - 他 - おそらく - harmfu)理性的な議論のために。 tl; dr: 'eval'はあなたの最初の選択ではいけません。注意深い審議の後、必要なときにのみ使用してください。 – Amadan

関連する問題

 関連する問題