我正在研究基于数组的模拟类型的东西。我正在尝试这样做,所以我可以对数组中的项进行颜色编码,但是出于某种原因,当我把它写出来时,格式化是远离的。
我认为这与丢失扫描的转义字符(因此标题)有关。
我现在有了这个,(只显示相关位)
@width = 80
puts @world.join("").scan(/.{#{@width}}|.+/).join("\n\r")
在数组中,我有字符串,有些我有转义字符,如
"\033[41mI\033[0m"
关于如何解决此问题的任何想法?
我只能猜测,但我认为当我在阵列上调用扫描时,转义部分仍被计入长度。
由于
答案 0 :(得分:0)
你是对的,转义序列计入字符串的长度:
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")
首先构建一个嵌套数组,其中每个子数组包含相同数量的元素。只要每个单元格只包含一个可见字符,这种方法就可以工作,我只是假设它。