红宝石错误 - “+”:Fixnum对象的没有隐式转换成字符串(类型错误)

问题描述:

这条线被投掷的错误:红宝石错误 - “+”:Fixnum对象的没有隐式转换成字符串(类型错误)

charLine.each_index { |i| charLine[i] = (charLine[i] + shift)} 

编辑:charLine[i]是一个数字(ASCII码)和shift是一个数也

我知道它与试图将变量中的数字添加到我在charLine数组索引中的字节ascii代码中有关。但是我还没有处理所有这就是为什么我有这个错误如此混乱的字符串...以下是有错误的方法:

 def caesarCipher(string) 
    puts "Original:\n #{string}" 
    charLine = string.chars 
    charLine.each_index { |i| charLine[i]=charLine[i].bytes } 
    charLine.flatten! 
    puts charLine.inspect 

    shift = 1 
    alphabet = ('A'..'Z').to_a 
    while shift <= alphabet.size 
     #moving up in the alphabet using ascii code 
     charLine.each_index { |i| charLine[i] = (charLine[i] + shift)} 
     #converting back to letters 
     charLine.each_index { |x| charLine[x] = charLine[x].chr } 

     puts "Shifted:\n #{charLine.inspect}" 
     puts "With a letter shift of #{shift}" 
     shift = shift + 1 
     @@shiftyArray.push(charLine.flatten) 
    end 

    end 

我已成功地重现该问题,并与一些调试输出,我可以看到的是,第一次迭代运行正常,问题只出现在第二次迭代( shift = 2)。

在第一次迭代烧焦线整数数组,所以整数+整数作品出细对于这一行:charLine.each_index { |i| charLine[i] = (charLine[i] + shift)}

但随后烧焦线被转换成阵列串的上下一循环线:

#converting back to letters 
charLine.each_index { |x| charLine[x] = charLine[x].chr } 

因此,在第二次迭代开始时,charLine现在是一个字符串数组,因为它没有被转换回来。然后在.each_line上,它会尝试将字符串+整数加起来,然后它就会爆炸。

解决方法是在每次迭代开始时将字符串数组重新映射为整数。

charLine.map!(&:ord) 

另一种方法是不修改数组,并把结果保存到一个临时变量,这里是一个工作示例:

def caesar_cipher(string) 
    shiftyArray = [] 
    charLine = string.split(//) 
    charLine.map!(&:ord) 

    shift = 1 
    alphabet_size = 26 
    while shift <= alphabet_size 
    shifted_array = charLine.map { |c| (c + shift) < 122 ? (c + shift) : (c + shift) - 26 } 
    shifted_array.map!(&:chr) 
    p shifted_array 

    shift += 1 
    shiftyArray.push(shifted_array.join) 
    end 
end 

caesar_cipher("testing") 
+0

美丽!谢谢,完全解决了一切:)我需要更多地研究地图方法 – Gcap 2015-03-03 03:07:29

您尝试添加shift,这是一个Fixnum转换为字符串。只需拨打to_s轮班将其转换为字符串:

charLine.each_index { |i| charLine[i] = (charLine[i] + shift.to_s)} 
+0

不会在这种情况下工作,我需要转移是一个整数来改变在charLine [i] – Gcap 2015-03-03 00:57:26

+0

ascii代码它给这个错误,而不是'shift.to_s' “'+':字符串不能被强制到Fixnum(TypeError)” – Gcap 2015-03-03 00:58:17