2017-09-16 105 views
2

我是Ruby新手(坦率地說,我剛開始學習它的樂趣,沒有任何未來的計劃),我注意到循環的奇怪行爲。我認爲我的問題來自於Ruby的機制知識的缺乏。Ruby循環創建空行

boysNames = ["Martin", "Lucas", "John"] 

#class only for one method. I know it's not absolutely correct, but huh I'm just learning Ruby 
class Human 
    def initialize(name) 
     @name = name; 
    end 
    String name = "" 

    def getName() 
     puts @name; 
    end 
end 

Array boys = [] 




#create objects 
for x in boysNames 
    tempBoy = Human.new(x) 
    boys.push(tempBoy) 
end 

#output for class 

puts "Method 1: for in loop \n" 
for x in boys 
    puts x.getName() 
end 


puts "\nMethod 2: manual array[var] \n" 
boys[0].getName() 
boys[1].getName() 
boys[2].getName() 

puts "\nMethod 3: .each do \n" 
boys.each do |i| 
    puts i.getName() 
end 

#output for Array 

puts "Method 1: for in loop \n" 

for x in boysNames 
    puts x 
end 


puts "\nMethod 2: manual array[var] \n" 
puts boysNames[0] 
puts boysNames[1] 
puts boysNames[2] 

puts "\nMethod 3: .each do \n" 
boysNames.each do |i| 
    puts i 
end 


#loop through the boys array 
puts "\nboys array: \n" 
for x in boys 
    puts x 
end 

所以我的問題是:爲什麼當我遍歷數組,一切都很好,當我遍歷類,我的結果由換行符分?有沒有我找不到的「隱形」物體?正如你所看到的,我的最後一個循環只能找到三個在內存中具有不同位置的對象。

如果答案中包含「如何工作」的解釋,我會很高興。

謝謝您提前;)

P.S.輸出:

Method 1: for in loop 
Martin 

Lucas 

John 


Method 2: manual array[var] 
Martin 
Lucas 
John 

Method 3: .each do 
Martin 

Lucas 

John 

Method 1: for in loop 
Martin 
Lucas 
John 

Method 2: manual array[var] 
Martin 
Lucas 
John 

Method 3: .each do 
Martin 
Lucas 
John 

boys array: 
#<Human:0x007f2a586db788> 
#<Human:0x007f2a586db648> 
#<Human:0x007f2a586db5d0> 

P.S.S.我使用this爲Ruby解釋器/編譯器(我聽說,紅寶石也可以被編譯,所以...)

+1

既然你在學習,我會指出你應該注意的一些編碼風格。你不需要類型註釋,比如'String name',只需要'name'。和'Array boys = []'一樣,只需使用'boys = []'。而Ruby使用'snake_case'而不是'camelCase'。我總是喜歡用[this](https://github.com/bbatsov/ruby-style-guide)等社區驅動的最佳實踐回購來更習慣地學習語言!希望能幫助到你。玩得開心學習Ruby,這是一種美妙的語言! –

+0

謝謝你的建議。 '字符串名稱'讓我知道什麼類型的數據是'名稱'。當談到代碼優化時,我絕對同意你的看法 我不知道Ruby中的snake_case習慣。很高興知道! – Thomas

回答

3

你打電話puts x.getName(),但getName()已經puts它裏面。

puts如果沒有一個參數,則在每個參數的末尾添加一個換行符。

print不添加新行。

What is the difference between print and puts?

+0

謝謝。這是一個愚蠢的錯誤,當我思考時,我會沖洗:D – Thomas

+3

實際上,由於「puts」總是返回nil,所以'getName'方法返回nil。 '將nil'結果放入一個空字符串(從nil.to_s)加一個換行符(由'puts'添加)。 – steenslag