2017-12-07 12 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로 읽어서 루비를위한 메소드에서 사용합니까?</p> <pre><code>IO.foreach("Matematik.txt") { |line| Test.take_test(line) } </code></pre> <p>이 질문에이 파일에 설정하는 방법은 다음과 같습니다 :

? '2 + 2 무엇입니까', [ '2' '3', '4', '5', 4

'3 + 3 무엇인가?'[ '3', '6', '9', 6

I 얻을 오류 : 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을 사용하는 것이 잘못된 이유는 무엇입니까? 지금까지 내 문제가 해결되었습니다. –

+0

'eval'은 임의 코드의 실행을 허용하기 때문에 데이터가 어디서 오는 것인지 정확히 알지 못한다면 보안 문제가 가장 중요합니다. 예를 들어 누군가이 프로그램을 다음과 같이 프로그램에 넣었다고 상상해보십시오 :''['cat/etc/passwd', [ "Haha", "What", "acker!"], 0]''; 질문을 표시 할 시간이되면 사용자에게 암호 파일이 표시됩니다. 데이터가 어디서 오는지 알더라도,'eval'은 Ruby의 메서드 캐시를 없애 코드를 느리게 만듭니다. 그러나 1 차적으로 안전 : "eval"을 결코 사용하지 않는 사람을 훈련 시키면 실수로 그것을 사용하는 유혹을받을 수 없습니다. – Amadan

+0

분명히, "eval'은 악"은 간결한 과다 단순화이지만, [여기] (https://softwareengineering.stackexchange.com/questions/311507/why-are-eval-like-features-considered-evil-in)을 읽으십시오. - 대비 - 다른 - 가능성 - harmfu) 잘 논의를 위해. tl; dr :'eval'은 절대로 첫 번째 선택이 아니어야합니다. 신중하게 검토 한 후에 사용해야합니다. – Amadan