2012-11-19 6 views
2

Ruby 1.8 용으로 작성된 RubyQuiz 용 코드를보고 있는데, 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에서 정수 부분을 취합니다. 문자열의 전자 첫 번째 부분과 Fixnum이라는로 변환 : 문자열이 어떤 숫자가 없을 때

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

당신은 예기치 않은 결과는, 그러나, 얻을 수 있습니다 귀하의 경우

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

을, 당신이 생각하는 변수 key에 대한 정수가 필요하지만 대신 문자열이 나타납니다. key.to_i 할 수도 있습니다. 희망이 도움이됩니다.