我正在爲朋友的心理調查項目創建一個簡單的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