這是我的代碼。當我寫入一個變數時,所有元素都會發生變化。(這是一個保齡球節目)
Frame = Struct.new(:first, :second, :total)
frame = Frame.new(1,2,3)
frames = Array.new(11,frame)
print "frames[0].first: " frames[0].first.to_s newLine
print "frames[1].first: " frames[1].first.to_s newLine
game[0].first = 10
print "frames[0].first: " frames[0].first.to_s newLine
print "frames[1].first: " frames[1].first.to_s newLine
frames[1].first = 20
print "frames[0].first: " frames[0].first.to_s newLine
print "frames[1].first: " frames[1].first.to_s newLine
列印:
frames[0].first: 1
frames[1].first: 1
frames[0].first: 10
frames[1].first: 10
frames[0].first: 20
frames[1].first: 20
uj5u.com熱心網友回復:
正如 Sergio Tulentsev 已經寫的那樣,您觀察到的行為發生是因為您將完全相同的內容參考Frame到所有陣列插槽中。
相反,您可以使用Array.new塊為每個陣列槽創建新的和不同的幀:
Frame = Struct.new(:first, :second, :total)
frames = Array.new(11) { Frame.new(1, 2, 3) }
順便說一句,當你從改變print到puts,然后換行符將被自動添加到輸出的結尾。當您使用字串插值而不是字串連接時,則無需to_s顯式呼叫,因為字串插值呼叫to_s隱式。
puts "frames[0].first: #{frames[0].first}"
puts "frames[1].first: #{frames[1].first}"
game[0].first = 10
puts "frames[0].first: #{frames[0].first}"
puts "frames[1].first: #{frames[1].first}"
frames[1].first = 20
puts "frames[0].first: #{frames[0].first}"
puts "frames[1].first: #{frames[1].first}"
uj5u.com熱心網友回復:
所有的元素都發生了變化
陣列的元素都是對同一個底層 Frame 物件的參考。當您使用其中一個參考來改變物件時,可以通過其他參考觀察到這些變化。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/365848.html
上一篇:如果不在物件陣列內觸發
