基础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
相关产品推荐
相关产品推荐

