我正在为朋友的心理调查项目创建一个简单的Ruby on Rails调查应用程序。 所以我们有调查,每个调查都有一堆问题,每个问题都有一个参与者可以选择的选项。没什么好激动Ruby:解析,替换和评估字符串公式
其中一个有趣的方面是每个答案选项都有一个与它相关的分数值。 因此,对于每项调查,总分都需要根据这些值进行计算。
现在我的想法是,而不是硬编码计算是让用户添加一个公式,总调查得分将被计算。示例公式:
"Q1 + Q2 + Q3"
"(Q1 + Q2 + Q3)/3"
"(10 - Q1) + Q2 + (Q3 * 2)"
所以只是基本的数学(为了清晰起见,附加了一些括号)。这个想法是保持公式非常简单,这样任何具有基本数学的人都可以在不解决一些花哨的语法的情况下进入它们。
我的想法是采取任何给定的公式,并根据参与者选择的分数来替换占位符,如Q1,Q2等。然后eval()新形成的字符串。事情是这样的:
f = "(Q1 + Q2 + Q3)/2" # some crazy formula for this survey
values = {:Q1 => 1, :Q2 => 2, :Q3 => 2} # values for substitution
result = f.gsub(/(Q\d+)/) {|m| values[$1.to_sym] } # string to be eval()-ed
eval(result)
所以我的问题是:
有没有更好的方式来做到这一点? 我愿意接受任何建议。
如何处理并非所有 占位符都被成功替换的公式(例如,一个 问题未得到解答)?例如:
{:Q2 => 2}
不是 值散列?我的想法是拯救eval(),但它不会在这种情况下失败coz(1 + + 2)/2
仍然可以eval() - ed ...任何想法?如何获得正确的结果?应该是2.5,但由于整数算术,它将截断为2.我不能指望提供正确公式(例如/ 2.0)的人理解这种细微差别。
我不指望这一点,但如何 最佳保护的eval()的滥用(例如 坏公式,操纵值 进来的)?例如:
f = 'system("ruby -v"); (Q1 + (Q2/3) + Q3 + (Q4 * 2))/2 '
谢谢!
是否有人会添加至少一些有助于我开始的Treetop示例。我在Treetop上读过的所有内容都有点超载。或者我应该开始一个新的问题?这变得太复杂了,因为我只是希望把东西扔在一起。没有任何长寿。 *叹息* – Swartz 2011-02-03 00:34:16