You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

修改说明

  1. 数据结构替换:用drop_tracker = {}替代原来的array = [],哈希的键是item名称,值是该item当前的amount,确保每个item唯一。
  2. 逻辑调整:
    • 当item已在哈希中时:先递增对象的amount,再把新的amount同步存入哈希。
    • 当item第一次出现时:直接把对象的初始amount存入哈希。
  3. 输出格式处理:用flat_map把哈希的键值对转换成一维数组,再用join(', ')拼接成你需要的字符串格式。

运行效果

比如某次随机执行后,会输出类似:

item2, 240, item1, 6

6
240

完全符合你的期望:数组里每个item只显示一次,amount和对象实际的amount保持一致。

内容的提问来源于stack exchange,提问作者seasonalz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:20:32