如何评估随机数学运算符?

问题描述:

我是一般的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.send(:+, 10) 

例如:

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

你为什么要使用sample的OPS,而不是数字?

+0

谢谢!正如我所说我很新,所以我只是尝试各种方法,看看他们如何工作。我会阅读发送:) – 2012-02-15 17:50:27

你正在寻找的魔法词是“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