2013-08-06 35 views
3

我想用未定義的變量來評估一個字符串。例如:公式= 2 * 3 + a結果應該返回一串6 + a。 eval方法可以做那樣的事情嗎?或者,你可以給我一些關於如何做到這一點的想法嗎?如何計算未定義變量的公式

更新:感謝您的所有輸入。我想這不像我想的那麼簡單。比方說,如果我不需要簡化公式,我所需要做的就是用字符串中的值替換變量?

實施例:

a = { "Bob" => 82, 
     "Jim" => 94, 
     "Billy" => 58, ........ and more} 

如何轉換此字符串

「2 * 3 + A [」 鮑勃 「] * b」 的

到這樣的:「2 * 3 + 82 * b「

再次感謝您的幫助。

+4

編程語言中沒有這樣的東西,你想要的更可能是數學函數解析。 – nicooga

+0

你的用例是什麼?如果您提供更多的上下文,我們可能會提供更好的解決方案。 – Nick

回答

3

你想要做的事情很複雜,我認爲這不值得去做。

您可以使用一些gem將字符串解析爲令牌樹。然後,查找沒有未定義變量的節點,並用計算出的值替換該節點。這樣做後,把樹放回一個字符串。

0

這裏是一個天真的解決方案:

str = "+ 1 * 2 - 3/2 + b - a" 

terms = str.gsub(/^[^+-]+|[+-][^+-]+/).to_a 
=> ["+ 1 * 2 ", 
    "- 3 ", 
    "+ b ", 
    "- a"] 

numbers, variables = terms.partition { |exp| eval(exp.to_s) rescue false } 
=> [["+ 1 * 2 ", "- 3 "], 
    ["+ b ", "- a"]] 

numbers.map! { |exp| exp.gsub(/\d+/, &:to_f) } 
=> ["+ 1.0 * 2.0 ", 
    "- 3.0/2.0 "] 

numbers.map! { |exp| eval(exp) } 
=> [2.0, -1.5] 

sum = numbers.reduce(:+) 
=> "0.5" 

result = "#{sum} #{variables.join}" 
=> "0.5 + b - a" 
+0

您可以從第一行的'str'中刪除空白(這可能導致錯誤代碼更少) – Shoe

+0

另外'str =「124 + 3 * 2 + 20 + 100/2 - c」'不起作用:返回'「150 + 100/2 - c」'。 – Shoe

+0

這就是爲什麼這是一個天真的解決方案。我想我有些東西,讓我編輯答案。 – nicooga

3

關於使用類似Parslet並作出解析表達式語法來簡化你的表情是什麼?看一下你開始走的頁面,通過一個簡單的例子,Parslet減少整數表達式。