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

基础Ruby中如何跟踪自动实例化的未分配对象?(猜数字游戏场景)

解决思路:用集合存储实例,而非自动生成变量名

在Ruby里,不要尝试自动生成变量名,这种做法不仅违背代码可读性原则,还会让后续维护变得异常麻烦。更合理的方案是用数组(或哈希)来统一管理所有ColorPicks实例,这样既能跟踪每个对象,又能轻松实现密码长度的可配置。

具体修改步骤

1. 修正模块与类的初始化问题

你的StartUp模块存在两个小问题:一是方法名不符合Ruby命名约定(应该用小写+下划线);二是Printer类里的@@i初始化时机不对——StartUp.how_many在用户输入前是nil,必须先调用输入方法再获取长度。

2. 用数组存储ColorPicks实例

修改Printer的code_maker方法,创建一个数组来收集每个新实例,最后返回这个数组,就能轻松跟踪所有密码位的信息。

修改后的完整代码

# 存储单个密码位的颜色与位置信息
class ColorPicks
  attr_reader :color, :place
  def initialize(color, place)
    @color = color
    @place = place
  end
end

# 配置密码长度的模块
module StartUp
  def self.how_many
    @how_many
  end

  # 修正方法名符合Ruby规范
  def self.how_many_colors
    puts "How long should the computer's code be?"
    @how_many = gets.chomp.to_i
  end 
end

# 生成密码的类
class Printer
  COLORS = {1 => 'red', 2 => 'blue', 3 => 'green'}

  def self.code_maker
    # 先确保用户已经输入了密码长度
    StartUp.how_many_colors unless StartUp.how_many
    password = []
    place = 1

    StartUp.how_many.times do
      # 注意rand(COLORS.length)生成0到length-1的数,COLORS键从1开始,所以要+1
      random_number = rand(COLORS.length) + 1
      password << ColorPicks.new(COLORS[random_number], place)
      place += 1
    end

    password # 返回存储所有实例的数组
  end
end

# 使用示例
# 生成密码数组
secret_code = Printer.code_maker
# 遍历查看每个密码位的信息
secret_code.each do |pick|
  puts "位置#{pick.place}的颜色是#{pick.color}"
end

关键改动说明

  • 把零散的ColorPicks实例存入数组password,通过数组可随时访问任意位置的实例
  • 修正了rand的使用问题:原来的写法会生成0、1、2,但COLORS的键是1、2、3,加1后才能正确取到颜色
  • 移除了不必要的类变量(@@i、@@place),改用局部变量更安全
  • 遵循Ruby命名规范,提升代码可读性

现在你可以通过secret_code数组轻松跟踪所有密码位的实例,比如验证玩家猜测时,只需遍历数组对比每个位置的颜色即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 16:35:14