Ruby中map!函数在Mastermind项目中表现异常求助
Mastermind猜色项目map!函数返回nil问题排查
我正在开发基础版Mastermind猜色项目,包含随机选色和用户猜色功能。map!函数本应遍历数组并修改原数组元素:随机选色场景中它能将数字转为对应颜色的带色圆形;但处理用户输入的场景中,数组却返回[nil,nil,nil,nil]。以下是相关代码:
颜色映射模块
module Shapes CIRCLE = "●" COLORS = { 1 => :red, 2 => :green, 3 => :magenta, 4 => :blue, 5 => :cyan, 6 => :yellow, 8 => :white, 9 => :black } end
随机选色代码
def random_code arr = Array.new(4) {(rand(1..6).to_i)} puts arr arr.map! do |item| color = COLORS[item] CIRCLE.colorize(color) end puts arr return arr end
用户输入处理代码
p_code.map! do |item| colors = COLORS[item.to_i] CIRCLE.colorize(colors) puts CIRCLE.colorize(colors) end
问题原因与修复方案
问题出在用户输入处理的map!块中:Ruby的块会返回最后一行代码的执行结果。你在块的最后一行调用了puts方法,而puts的返回值始终是nil,因此map!会把数组的每个元素都替换成nil。
反观随机选色的代码,块的最后一行是CIRCLE.colorize(color),这个表达式返回带颜色的圆形字符串,所以能正确修改数组内容。
修复方法有两种:
- 把
puts移出map!块,单独遍历输出:
p_code.map! do |item| color = COLORS[item.to_i] CIRCLE.colorize(color) end p_code.each { |circle| puts circle }
- 在块内先保存带颜色的圆形,输出后再返回该值:
p_code.map! do |item| color = COLORS[item.to_i] colored_circle = CIRCLE.colorize(color) puts colored_circle colored_circle end
调整后,map!就能正确将数组元素替换为带颜色的圆形字符串,不再返回[nil,nil,nil,nil]。
内容的提问来源于stack exchange,提问作者Revanth Rockie
相关产品推荐
相关产品推荐

