RUBY:使用结构数组 [关闭]
Posted
技术标签:
【中文标题】RUBY:使用结构数组 [关闭]【英文标题】:RUBY: Using An Array of Structs [closed] 【发布时间】:2022-01-02 23:18:08 【问题描述】:这是我的代码。当我写入一个变量时,所有元素都会发生变化。 (这是一个保龄球项目)
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
【问题讨论】:
【参考方案1】:正如 Sergio Tulentsev 已经写的那样,您观察到的行为发生是因为您将完全相同的 Frame
引用到所有数组槽中。
相反,您可以使用Array.new
with a block 为每个阵列槽创建新的不同帧:
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"
【讨论】:
【参考方案2】:所有元素都会改变
array 的元素都是对同一个底层 Frame 对象的引用。当您使用其中一个引用来改变对象时,可以通过其他引用观察到更改。
【讨论】:
我知道发生了什么。我只是找不到正确的代码是什么。谢谢斯派克曼把它给我。有谁知道有这个的好资源吗?以上是关于RUBY:使用结构数组 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章