我在ruby中制作了一个简单的计算器。但是一旦程序停止运行并且必须重新运行。我尝试了以下但它以无限循环结束。如何编写它以便它将一直运行直到用户告诉它退出?
puts "Please enter two digits separated by operation you would like to calculate:"
input = gets.chomp.split(' ')
while input != nil
if input[1] == "+"
puts input[0].to_i + input[2].to_i
elsif input[1] == "-"
puts input[0].to_i - input[2].to_i
elsif input[1] == "*"
puts input[0].to_i * input[2].to_i
else
puts input[0].to_i / input[2].to_i
end
end
答案 0 :(得分:0)
split(' ')
返回一个数组而不是nil,因此input != nil
总是求值为true,这会产生无限循环。
您可能希望在某些输入中尝试while input.size == 2
或break
while循环,例如:
while true
# ... if / elsif for operators
elsif input[1] == 'exit'
break # end the 'while' loop
end
end
答案 1 :(得分:0)
递归方法:
def recurs_calc
puts "Please enter two digits separated by operation you would like to calculate:"
input = gets.chomp.split(' ')
if input[1] == "+"
puts input[0].to_i + input[2].to_i
recurs_calc
elsif input[1] == "-"
puts input[0].to_i - input[2].to_i
recurs_calc
elsif input[1] == "*"
puts input[0].to_i * input[2].to_i
recurs_calc
elsif input[1] == '/'
puts input[0].to_f / input[2].to_i
recurs_calc
elsif input[0] == 'exit'
exit
else
puts 'please enter two numbers with SPACES i.e. 4 + 4 then enter'
recurs_calc
end
end
recurs_calc
我们会根据条件回忆recurs_calc
,并在用户输入'exit'
时退出。注意我还在to_f
分支中使用/
来获得更准确的结果,并包含一个考虑了“错误”输入的最终分支。尝试运行它。
使用eval
的另一种方法可能会对您有所帮助,尽管这可能有点作弊。出于安全原因,使用eval
也被认为是不好的做法。还要特别感谢@nicael字符串替换:
loop do
puts "Enter calculation"
input = gets.chomp
if input == 'exit'
exit
else
p eval (input.gsub(/(\d+)/, '\1.0'))
end
end
答案 2 :(得分:0)
进行如下更改:
msg = "Please enter two digits separated by operation you would like to calculate:"
puts msg
while input = gets.chomp.split(' ')
if input[1] == "+"
puts input[0].to_i + input[2].to_i
elsif input[1] == "-"
puts input[0].to_i - input[2].to_i
elsif input[1] == "*"
puts input[0].to_i * input[2].to_i
else
puts input[0].to_i / input[2].to_i
end
puts msg
end
答案 3 :(得分:0)
这一切都是Ruby的一大堆,可以大大简化。这里的关键是将Ruby方式应用于事物,优雅的解决方案立即变得明显。
考虑用实际的while
结构替换那个混乱的loop
循环。同时根据split
的含义命名loop do
puts "Please enter two digits separated by operation you would like to calculate:"
left, operator, right = gets.chomp.split(' ')
result = case (operator)
when '+'
left.to_i + right.to_i
when '-'
left.to_i - right.to_i
when '*'
left.to_i * right.to_i
when '/'
left.to_i / right.to_i
end
puts result
end
产生的元素:
loop do
puts "Please enter two digits separated by operation you would like to calculate:"
left, operator, right = gets.chomp.split(' ')
result = case (operator)
when '+', '-', '*', '/'
left.to_i.send(operator, right.to_i)
end
puts result
end
现在这看起来像很多重复,这里唯一改变的是运营商。由于Ruby是一种高度动态的语言,我们实际上可以将其折叠起来:
loop do
puts "Please enter digits separated by the operations you would like to calculate:"
values = gets.chomp.split(' ')
while (values.length > 2)
left = values.shift.to_i
operator = values.shift
right = values.shift.to_i
values.unshift(left.send(operator, right))
end
puts values[0]
end
现在还有一些重复。如何进一步减少这种情况并提供更大的灵活性:
layoutSubviews
这意味着您可以将任意长的数字列表添加到一起。将字符串标记为数字和非数字组件并不困难,但这可以让您自己尝试。