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:使用结构数组 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

命名这个 python/ruby 语言结构(使用数组值来满足函数参数)

ruby 如何生成树结构形式的数组?

结构到数组[关闭]

作物哈希结构:Ruby on rails

如何在Coredata中存储自定义结构数组[关闭]

在Ruby中对数组使用冒泡排序方法[关闭]