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)
ありがとう:次の手順を実行します! evalを使用すると何が問題になりますか?これまでのところ私の問題は解決しました。あなたはデータがから来ている場所を正確に知っている限りeval'は、任意のコードの実行が可能になります '以来 –
主な関心事は、セキュリティです。例えば、誰かがこの行をあなたのプログラムに入れたとしましょう: '' ['cat/etc/passwd'、[" Haha "、" What "、" acker! "]、0]' ';質問を表示する時間が来ると、ユーザーにパスワードファイルが表示されます。データがどこから来ているのか分かっていても、 'eval'はRubyのメソッドキャッシュを殺し、コードを遅くします。しかし、主にセキュリティ:「eval」を使用しないように自分自身を訓練すれば、誤って安全に使用するように誘惑することはできません。 – Amadan
明らかに、「evalは悪です」とは誇張された過度の簡略化ですが、[ここ](https://softwareengineering.stackexchange.com/questions/311507/why-are-eval-like-features-considered-evilin - コントラスト - 他 - おそらく - harmfu)理性的な議論のために。 tl; dr: 'eval'はあなたの最初の選択ではいけません。注意深い審議の後、必要なときにのみ使用してください。 – Amadan