2012-02-15 66 views
0

我是一般的Ruby和編程新手。 我一直在試圖把一個隨機創建數學問題的小腳本放在一起,但是我在生成一個隨機數學運算符時遇到了麻煩。如何評估隨機數學運算符?

我至今腳本:

num = (1..10).to_a 

num1 = num.shuffle[0] 
num2 = num.shuffle[0] 

op = %w{+ - = /} 
op1 = op.sample 

puts w = "#{num1} #{op1} #{num2}" 

puts "Your answer is:" 
answer = gets() 

solution = num1 + "what do I put here??" + num2 

if answer.to_i == solution 
    puts "Correct! The answer is #{solution}" 
else 
    puts "Incorrect, the answer is #{solution}" 
end 

我已經成功地挑選出一個隨機的運營商,但因爲它是一個字符串,不能在解決方案中使用它。

+0

哦,你可能會改變標題 - 你解決了隨機算子問題,你的問題實際上是如何評估字符串。 – 2012-02-15 17:52:03

回答

5

爲什麼不使用的符號,並將其與參數發送到操作?

5.send(:+, 10) 

例如:

> syms = [:+, :-, :*, :/] 
=> [:+, :-, :*, :/] 
> num1.send(syms.sample, num2) 
=> 50 

你爲什麼要使用sample的OPS,而不是數字?

+0

謝謝!正如我所說我很新,所以我只是嘗試各種方法,看看他們如何工作。我會閱讀發送:) – 2012-02-15 17:50:27

2

你正在尋找的魔法詞是「eval」。一旦[對不起,得到了我的書桌打斷]一旦你的字符串,你只需EVAL它得到的結果:

expr = "42"+"+"+"54" 
result = eval(expr) 

irb(main):006:0> expr = "42"+"+"+"54" 
=> "42+54" 
irb(main):007:0> result = eval(expr) 
=> 96 
+1

Eval?當你可以使用'send'時,'eval'是一個嚴重的安全風險。由於這裏的數據可能來自外部來源,這是一種安全和性能風險('eval'比'send'慢得多)。 – Linuxios 2012-02-15 17:52:52

+0

謝謝查理,這也很棒! – 2012-02-15 17:54:17

+0

@ Linux_iOS.rb.cpp.c.lisp.m.sh嗯,但我敢肯定,在這種情況下我們並沒有處理嚴重的安全風險。 – 2012-02-15 17:55:39