2012-02-11 91 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