我正在尝试制作命令行计算器,但我不知道从哪里开始。
这是我到目前为止所做的:
puts "Calculator "
puts "please write what youd like to calculate . i.e '4 + 3 * 4'"
cal = gets.chomp.split(" ")
cal.map!.with_index do |num, i|
if i.even?
num.to_i
else
num.to_sym
end
end
cal.inspect
# i.e [3, :+, 4]
我希望能够获得数组中的内容并返回结果。像这样:3 + 4 = 7
答案 0 :(得分:3)
你几乎就在那里!
正如您可能意识到的那样,像+
这样的运算符只是Ruby中方法的语法糖,所以这个数组:
cal = [3, :+, 4]
...拥有您需要的一切:接收器(3
),调用该接收器的方法(:+
)和参数(4
):
recv, meth, arg = cal
recv.public_send(meth, arg)
# => 7
以上内容相当于调用3.+(4)
,这当然与3 + 4
相同。
答案 1 :(得分:2)
对用户的输入字符串使用eval,它应该为您处理。 I. e。:
eval('4 + 3 * 4')
#⇒ 16
如果你想看到处理不同字符串的eval的不同快速示例,你可以在irb中运行它。
这是关于使用eval的帖子。
https://rubymonk.com/learning/books/5-metaprogramming-ruby-ascent/chapters/24-eval/lessons/63-eval
答案 2 :(得分:1)
对于简单的计算器,您可能希望首先检查 BODMAS 顺序中符号的位置。
保持简单,将其更改为 DMAS - 除法,乘法,加法,然后减法。
我们来看"4 + 3 - 5 / 2 * 5"
。假设您认为用户将每个符号或数字与空格分开,我们可以用空格分割该字符串。
此外,假设用户输入了正确的(非错误的)计算,我们应该查找第一个操作员的索引。由于DMAS,我们应该先做分工。
我们找到/
的索引,然后将之前索引中的值除以之后索引中的值,因此5 / 2
。
在数组中,将您刚刚使用的值和运算符替换为您计算的值。因此,["4", "+", "3", "-", "5", "/", "2", "*", "5"]
变为[4, "+", 3, "-", 2.5, "*", 5]
。
然后,您可以重复此过程,根据操作符的内容更改您对值的操作。