在简单程序上获取NoMethodError

时间:2014-03-07 06:41:30

标签: ruby

我是一个完整的Ruby newb,我正在尝试编写一个简单的程序来将Celsius转换为Fahrenheit,反之亦然。   到目前为止,一切都在我的代码中工作,直到它开始转换计算为止。   当它到达第一行转换(摄氏温度到华氏温度转换)时,我在终端中收到错误

  

“test.rb:17:in':undefined method` - 'for”45“:String   (NoMethodError)“

有人可以请我填写我遗失的内容吗?我试图谷歌这无济于事,这可能只是因为我不确定我在寻找什么。代码如下,提前感谢!

puts "This program will convert temperatures from Celcius to Fahrenheit" 
puts "or Fahrenheit to Celcius"
puts "to begin, please select which unit you are converting from"
puts "enter 0 for Fahrenheit or 1 for Celcius"
unit_from=gets.chomp
puts "please input the temperature"
degrees_from=gets.chomp

#this is the formula for celcius to fahrenheit
Celcius=(degrees_from-32)*(5/9)

#this is the formula for fahrenheit to celcius
Fahrenheit=(degrees_from)*(1.8)+32

if unit_from = 0
    puts Celcius
elsif unit_from =  1
    puts Fahrenheit
else 
    puts "You have entered and invalid option."
end

3 个答案:

答案 0 :(得分:0)

测试相等性需要两个等于,如下所示

if unit_from == 0
    puts Celcius
elsif unit_from ==  1
    puts Fahrenheit
else 
    puts "You have entered and invalid option."
end

答案 1 :(得分:0)

gets返回一个字符串:

  

获取(sep = $ /)→string或nil
  获取(限制)→字符串或零
  获取(sep,limit)→string或nil
  返回(并分配给$_ARGV(或$*)中文件列表中的下一行,如果命令行中没有文件,则返回标准输入。

然后在该String上调用chomp并获取另一个字符串:

  

chomp(separator = $ /)→new_str
  返回一个新的String,其中从 str (如果存在)的末尾删除了给定的记录分隔符。

这意味着您在unit_fromdegrees_from中有字符串:

unit_from    = gets.chomp
#...
degrees_from = gets.chomp

字符串对减法一无所知,因此degrees_from-32会给您一个错误。如果您想使用整数输入,请输入几个to_i个调用:

unit_from    = gets.chomp.to_i
#...
degrees_from = gets.chomp.to_i

下一个问题是5/9是整数除法,因此5/9只是编写0的一种复杂方式。你想要浮点数,所以你应该使用5.0/95/9.05.to_f/9,......

之后的下一个问题是你最终if

if unit_from = 0
  puts Celcius
elsif unit_from =  1
  puts Fahrenheit
else 
  puts "You have entered and invalid option."
end

总是会说puts Celciusunit_from = 0是一项任务,而非比较; Ruby中的赋值也是一个表达式,因此if unit_from = 0在语法上有效但在逻辑上无效;赋值的值是它的右边所以unit_from = 0(作为表达式)只是0而且由于0在Ruby中是真的,你总是会在第一个分支中结束。您想使用==进行比较:

if unit_from == 0
  puts Celcius
elsif unit_from ==  1
  puts Fahrenheit
else 
  puts "You have entered and invalid option."
end

答案 2 :(得分:0)

unit_from和degrees_from的值都是字符串,并且由于显而易见的原因,您无法对字符串进行乘法运算。所以首先将它们转换为整数。

unit_from=gets.chomp.to_i
puts "please input the temperature"
degrees_from=gets.chomp.to_i

to_i 用于将任何字符串转换为整数。例如: “2”是一个字符串,将其转换为整数

2.0.0-p247 :001 > "2"
 => "2" 
2.0.0-p247 :002 > "2".class
 => String 
2.0.0-p247 :003 > "2".to_i
 => 2 
2.0.0-p247 :004 > "2".to_i.class
 => Fixnum 

“=”也是一个赋值运算符,即 a = 2,仅将值2赋给变量a。

检查是否值为2,我们需要使用“==”

2.0.0-p247 :006 > a = 2
 => 2 
2.0.0-p247 :007 > puts a
2
 => nil 
2.0.0-p247 :008 > a == 2
 => true