Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何计算未定义变量的公式_Ruby - Fatal编程技术网

Ruby 如何计算未定义变量的公式

Ruby 如何计算未定义变量的公式,ruby,Ruby,我正在尝试使用未定义的变量计算字符串。例如:公式=2*3+a结果应返回6+a字符串。eval方法可以做类似的事情吗?或者,你能告诉我怎么做吗 更新:感谢您的所有投入。我想这并不像我想象的那么简单。假设我不需要简化公式,只需要用字符串中的值替换变量 例如: a = { "Bob" => 82, "Jim" => 94, "Billy" => 58, ........ and more} 如何转换此字符串 “2*3+a[“鲍勃”]*b” 对此:“2*3

我正在尝试使用未定义的变量计算字符串。例如:公式=
2*3+a
结果应返回
6+a
字符串。eval方法可以做类似的事情吗?或者,你能告诉我怎么做吗

更新:感谢您的所有投入。我想这并不像我想象的那么简单。假设我不需要简化公式,只需要用字符串中的值替换变量

例如:

a = { "Bob" => 82,
       "Jim" => 94,
       "Billy" => 58, ........ and more}
如何转换此字符串

“2*3+a[“鲍勃”]*b”

对此:“2*3+82*b”


再次感谢您的帮助。

您要做的事情很复杂,我认为不值得这么做


您可以使用一些gem将字符串解析为令牌树。然后,查找没有未定义变量的任何节点,并用计算值替换该节点。完成此操作后,将树放回字符串。

以下是一个简单的解决方案:

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"

使用类似于和生成解析表达式语法的东西来简化表达式怎么样?查看入门页面,其中介绍了一个简单的示例,其中Parslet减少了整数表达式。

编程语言中没有类似的示例,您更希望的是数学函数解析。您的用例是什么?如果您提供更多的上下文,我们可能会给出更好的解决方案。您可以删除第一行中
str
中的空格(这可能会导致代码不那么容易出错?)。而且
str=“124+3*2+20+100/2-c”
不起作用:返回
“150+100/2-c”
。这就是为什么这是一个天真的解决方案。我想我得到了一些东西,让我编辑一下答案。