Ruby-数组中的转义字符引发扫描

Ruby-数组中的转义字符引发扫描,ruby,arrays,escaping,character,Ruby,Arrays,Escaping,Character,我正在研究一种基于阵列的模拟类型的东西。我正试图使它,以便我可以彩色代码的项目在数组中,但由于某种原因,当我写出来,格式是远远偏离 我相信这与转义字符脱离扫描(因此标题)有关 我目前得到了这个(只显示了相关的位) 在数组中,我有字符串,在一些数组中有转义字符,例如 “\033[41mI\033[0m” 有没有办法解决这个问题 我只能猜测,但我认为当我调用阵列上的扫描时,逃逸部分仍被计入长度 谢谢你说得对,转义序列计入字符串的长度: str = "\033[41mI\033[0m" str.siz

我正在研究一种基于阵列的模拟类型的东西。我正试图使它,以便我可以彩色代码的项目在数组中,但由于某种原因,当我写出来,格式是远远偏离

我相信这与转义字符脱离扫描(因此标题)有关

我目前得到了这个(只显示了相关的位)

在数组中,我有字符串,在一些数组中有转义字符,例如

“\033[41mI\033[0m”

有没有办法解决这个问题

我只能猜测,但我认为当我调用阵列上的扫描时,逃逸部分仍被计入长度


谢谢你说得对,转义序列计入字符串的长度:

str = "\033[41mI\033[0m"
str.size                 #=> 10
str.scan(/./).to_a       #=> ["\e", "[", "4", "1", "m", "I", "\e", "[", "0", "m"]
代码失败的原因是您正在使用正则表达式再次拆分连接的字符串,其中一个单元格突然占用了十个字符,而不是一个字符。因此,
@width
实际上指的是单元格的数量,而不是字符的数量。作为构建输出的另一种方法,我建议方法:

puts @world.each_slice(@width).map(&:join).join("\n\r")

它首先构建一个嵌套数组,其中每个子数组由相同数量的元素组成。只要每个单元格只包含一个可见字符(我只是假设),这种方法就可以工作。

为此,我必须更改转义字符的存储方式,以使此格式正确,但它仍然比我的其他尝试工作得更好。谢谢你的帮助
puts @world.each_slice(@width).map(&:join).join("\n\r")