这是我学习Ruby的第一天。我正在尝试编写一个Ruby程序,询问用户吃饭的成本,然后他们想要提示的百分比,然后进行计算并打印出结果。我写了以下内容:
puts "How much did your meal cost?"
cost = gets
puts "How much do you want to tip? (%)"
tip = gets
tip_total = cost * (tip/100.0)
puts "You should tip $" + tip_total
当我尝试在终端中运行它时,我收到以下错误消息:
ip_calculator.rb:7:in `<main>': undefined method `/' for "20\n":String (NoMethodError)
我不知道此消息的含义,有人可以帮助我理解错误消息和/或我的代码有什么问题吗?谢谢。
答案 0 :(得分:3)
ip_calculator.rb:7:in `<main>': undefined method `/' for "20\n":String (NoMethodError)
我不知道这个消息是什么意思
让我们分解一下:
ip_calculator.rb
7
行号(可能是tip_total = cost * (tip/100.0)
)<main>
班级(main
是Ruby的顶级班级)"undefined method `/' for "20\n":String"
错误消息NoMethodError
例外类(http://ruby-doc.org/core/NoMethodError.html)有人可以帮助我理解错误消息
错误消息"undefined method `/' for "20\n":String"
表示您尝试在对象/
上调用方法"20\n"
,该方法是String
并且此对象未实现这样的方法:
"20\n" / 100
#=> NoMethodError: undefined method `/' for "20\n":String
我的代码出了什么问题?
Kernel#gets
返回一个字符串。 gets
不会尝试解释您的输入,只会传递收到的字符。如果在终端中键入 2 0 return ,则gets
将返回包含相应字符"2"
的字符串, "0"
和"\n"
。
要转换值,我会使用内置转换方法Kernel#Integer
或Kernel#Float
:
cost = Float(gets)
与to_i
和to_f
不同,如果您输入非数字值,这些方法会引发错误。
答案 1 :(得分:1)
当您从STDIN输入值时,它是String
。并且ruby不能将String分成100个。
这是一个有效的例子:
#!/usr/bin/env ruby
puts "How much did your meal cost?"
cost = gets.to_f
puts "How much do you want to tip? (%)"
tip = gets.to_f
tip_total = cost * (tip/100.0)
puts "You should tip $ #{tip_total.round(2)}"
所有输入的值都会转换为Float
s,进行计算,然后打印舍入值。
[retgoat@iMac-Roman ~/temp]$ ./calc.rb
How much did your meal cost?
123.45
How much do you want to tip? (%)
12.43
You should tip $ 15.34