2012-02-11 98 views
2

我遵循LearnRubyTheHardWay教程,难以修改exercise 29。一切工作正常,如果我这样定义的变量(如教程):无法在ruby中使用STDIN.gets.chomp()获取正确的输入

people = 100000 
cats = 34 
dogs = 56 

但是,如果我尝试从标准输入得到的变量,比如:

puts "How many people are here?" 
people = STDIN.gets.chomp() 
puts "How many cats?" 
cats = STDIN.gets.chomp() 
puts "And how many dogs?" 
dogs = STDIN.gets.chomp() 

等式运算返回false结果如果他们只使用数字的前两位数字计算结果。所以如果我给人们输入100000000,给猫输入11,12或13,方法会返回“太多猫”。如果我输入150000000给猫和其他人< 15,他们会返回“猫不多”。必须修改

dogs += 5 

dogs += "5" 

否则我得到以下错误:在'+':不能转换为长整数字符串(类型错误)

如果我离开了双引号到位并恢复到人= 10000的东西,我得到以下错误:在`+'中:字符串可以' t被强制转换为Fixnum(TypeError)

所以说,我对教程中的代码没有任何问题,只是尝试了解导致由STDIN方法引入错误的原因。我查看了RubyDoc.org,看看它是否与fixnum,整数或字符串类或与chomp相关的任何问题,或者获取方法但找不到原因。我之前或之后也尝试过to_i和to_s,但没有得到任何结果。

文件的完整的源代码如下:

puts "How many people are here?" 
people = STDIN.gets 
puts "How many cats?" 
cats = STDIN.gets 
puts "And how many dogs?" 
dogs = STDIN.gets 

#people = 100000 
#cats = 34 
#dogs = 56 

puts "So, %d people, %d cats and %d dogs, huh?" % [people,cats,dogs] 

if people < cats 
    puts "Too many cats! The world is doomed!" 
end 

if people > cats 
    puts "Not many cats! The world is saved!" 
end 

if people < dogs 
    puts "The world is drooled on!" 
end 

if people > dogs 
    puts "The world is dry!" 
end 

dogs += "5" 
puts "Now there are #{dogs} dogs." 

if people >= dogs 
    puts "People are greater than or equal to dogs." 
end 

if people <= dogs 
    puts "People are less than or equal to dogs." 
end 

if people == dogs 
    puts "People are dogs." 
end 

回答

3

的问题是,STDIN.gets返回一个字符串。所有的比较操作因此都会对字符串进行操作。例如:

people = "100000000" 
cats = "11" 

puts people < cats # => true! 

这是因为<将字典顺序比较字符串(和1000...11前的字母)。实际上有在你的例子一个点,使得它很明显的东西是怎么回事:

dogs = STDIN.gets 
dogs += "5" 

如果你输入7在这里,它应该打印出来75。你看,它只是连接字符串。

如何解决这个问题?很简单,只需将字符串转换为整数:

puts "How many people are here?" 
people = STDIN.gets.to_i 
puts "How many cats?" 
cats = STDIN.gets.to_i 
puts "And how many dogs?" 
dogs = STDIN.gets.to_i 
+0

谢谢,我尝试了people.to_i,但现在我发现我忘了像“people = people.to_i”这样做。我还没有看到任何像STDIN.geti而不是获取。有没有什么地方可以建议学习rubydoc.org以外的方法? – barerd 2012-02-11 14:52:49

+0

@barerd:不存在'STDIN.geti'这样的东西。您使用'gets.to_i',因此在STDIN文件流对象上调用['gets'](http://apidock.com/ruby/IO/gets)方法,然后调用['to_i'](http: //apidock.com/ruby/String/to_i)在生成的'String'对象上被调用。如果您想了解可用方法的概述,可以使用[apidock](http://apidock.com/ruby),这是rubydoc的一个结构。但是,最好先对语言有一个基本的了解(教程对此很有帮助)。 – 2012-02-11 15:57:04

+0

Apidock将成为教程的一个很好的赞美。也谢谢你。 – barerd 2012-02-11 16:22:29