2012-11-19 39 views
2

我正在查看Ruby 1.9中用Ruby 1.8编写的一些代码,现在在1.9.2中运行它时会引发错误。这种方法强制将字符串强制转换为Fixnum

def encrypt(s) 
    return process(s) {|c, key| 64 + mod(c + key - 128)} 
end 

给我下面的错误

in `+': String can't be coerced into Fixnum (TypeError) 

这里是我的代码:

def mod(c) 
    return c - 26 if c > 26 
    return c + 26 if c < 1 
    return c 
end 

def process(s, &combiner) 
    s = sanitize(s) 
    out = "" 
    s.each_byte { |c| 
    if c >= 'A'.ord and c <= 'Z'.ord 
     key = @keystream.get 
     res = combiner.call(c, key[0]) 
     out << res.chr 
    else 
     out << c.chr 
    end 
    } 
    return out 
end 
+0

查找函数'mod',我不确定它是新的'modulo'函数还是自定义的? – Candide

+0

@Candide发布了mod函数 – BrainLikeADullPencil

+0

还显示了进程函数 –

回答

5

您不能使用“+”操作符将字符串添加到一个整数。在IRB,

irb(main):001:0> 1 + '5' 
TypeError: String can't be coerced into Fixnum 

或者周围的其他方式:

irb(main):002:0> '5' + 1 
TypeError: can't convert Fixnum into String 

您必须将字符串转换到一个Fixnum对象,即

irb(main):003:0> '5'.to_i + 1 
=> 6 

irb(main):004:0> 1 + '5'.to_i 
=> 6 

“to_i”将包含th中的整数部分E中的字符串的第一部分,并将其转换为一个Fixnum:

irb(main):006:0> 1 + '5five'.to_i 
=> 6 

你可能会得到意想不到的效果,然而,当字符串没有编号:

irb(main):005:0> 1 + 'five'.to_i 
=> 1 

在你的情况,我认为你是期望一个变量key的整数,但是会得到一个字符串。你可能想要做key.to_i。 希望这有助于。

相关问题