2

我正在查看一些用 Ruby 1.8 编写的用于 RubyQuiz 的代码,当我在 1.9.2 中运行它时会抛出错误。这种方法

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
4

1 回答 1

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" 将接受字符串第一部分的整数部分并将其转换为 FixNum:

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

但是,当字符串没有数字时,您可能会得到意想不到的结果:

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

在您的情况下,我认为您期望变量为整数,key但取而代之的是字符串。你可能想做key.to_i. 希望这可以帮助。

于 2012-11-19T02:59:14.720 回答