2

RubyQuiz 用に Ruby 1.8 で記述されたコードを見ていますが、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 に答える