Ruby中如何实现数组内对象变量递增?现有代码问题求解
问题分析与解决方案
你的代码里对象的amount其实是正确递增的(看你实际输出里的最后两行6和240),问题出在用来展示的数组上:你用普通数组存储item和初始amount,之后每次递增对象的amount时,数组里的旧值根本没被更新,所以数组一直显示第一次加入的初始值。
要实现「每个item仅显示一次,且amount随选中次数递增」,最合适的方式是用**哈希(Hash)**来跟踪每个item的当前amount,而不是普通数组——哈希可以通过item名称作为键,直接更新对应的值,天然保证每个item只存一次。
修改后的完整代码
class Drop attr_accessor :item, :price, :amount end drop1 = Drop.new() drop1.item = "item1" drop1.price = 2247 drop1.amount = 1 drop2 = Drop.new() drop2.item = "item2" drop2.price = 4401 drop2.amount = 60 x = 0 # 把普通数组改成哈希,用来跟踪每个item的当前amount drop_tracker = {} while x < 10 rand1 = rand(2) if rand1 == 0 if drop_tracker.key?(drop1.item) # 先递增对象的amount,再同步更新哈希里的值 drop1.amount += 1 drop_tracker[drop1.item] = drop1.amount else # 第一次出现时,把item和初始amount存入哈希 drop_tracker[drop1.item] = drop1.amount end elsif rand1 == 1 if drop_tracker.key?(drop2.item) # 同理,递增后同步更新哈希 drop2.amount += 60 drop_tracker[drop2.item] = drop2.amount else drop_tracker[drop2.item] = drop2.amount end end x += 1 end # 把哈希转换成你需要的格式:item, amount, item, amount... result_array = drop_tracker.flat_map { |item, amount| [item, amount] } puts result_array.join(', ') puts "" puts drop1.amount puts drop2.amount
修改说明
- 数据结构替换:用
drop_tracker = {}替代原来的array = [],哈希的键是item名称,值是该item当前的amount,确保每个item唯一。 - 逻辑调整:
- 当item已在哈希中时:先递增对象的
amount,再把新的amount同步存入哈希。 - 当item第一次出现时:直接把对象的初始
amount存入哈希。
- 当item已在哈希中时:先递增对象的
- 输出格式处理:用
flat_map把哈希的键值对转换成一维数组,再用join(', ')拼接成你需要的字符串格式。
运行效果
比如某次随机执行后,会输出类似:
item2, 240, item1, 6 6 240
完全符合你的期望:数组里每个item只显示一次,amount和对象实际的amount保持一致。
内容的提问来源于stack exchange,提问作者seasonalz
相关产品推荐
相关产品推荐

