2017-09-17 4 views
0

私はThe Odin ProjectからRubyコースをやっています。配列のRan .mapを新しい配列に割り当てましたが、[0]以外のすべてのインデックスに 'nil'が表示されています

私はまだRubyの新機能です。

以下のコードでは、文字列を取り込み、「シーザー暗号」を使用して暗号化しようとしています。この場合、文字列を取り、文字列5の値の文字を右にシフトしています。例えば「A」は「F」、「w」は「b」になります。

まず第一に、ここで私が間違っていると、おそらくより良い方法で行うことができると思うものです:

ライン5 decrypt = ascii.map...に - これがないと思えます。 asciiのすべての値を新しい変数に代入することなく変更する方が良い方法があります。私はここでの問題は、私は変数に配列を指す別の変数を割り当てるよということだと思います

私の質問がある。(?):このdecryptindex[0][66, nil,...nil]ことを引き起こしていますか? asciiで、最初のascii値をシフトされたascii値に再割り当てするための正しい方法/方法は何ですか?条件が満たされない場合nilを返しif Rubyで

1 def caesar_cipher(string, shift) 
2 
3 ascii = string.chars.map(&:ord) 
4 p ascii 
5 decrypt = ascii.map { |letter| 
6  if letter.between?(65, 90) 
7  letter += shift 
8  if letter > 90 
9   letter = (letter - 90) % 26 + 64 
10  end 
11  elsif letter.between?(97, 122) 
12  letter += shift 
13  if letter > 122 
14   letter = (letter - 122) % 26 + 96 
15  end 
16  end 
17 } 
18 
19 p decrypt 
20 
21 end 
22 
23 caesar_cipher("What a string!", 5) 
24 
25 #=> [[87, 104, 97, 116, 32, 97, 32, 115, 116, 114, 105, 110, 103, 33] 
    # result from `p ascii` in line 4 

    [66, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil] 
    # result from `p decrypt` in line 19 

答えて

0

ifの結果にあなたmapので、あなたは常に値を返すために検討する必要があります。

if letter > 90 
    letter = (letter - 90) % 26 + 64 
end 

は次のように読むべきである:

if letter > 90 
    (letter - 90) % 26 + 64 # no need to assign letter again 
else 
    letter # return the value from all branshes 
end 

これはどこでも行われるべきです。

+0

これが助けになりました!私のコードからはもっと欠けていました。私は 'decrypt'を繰り返して' .join'とブロックの最後をコールしなければなりませんでした。ありがとう! –

関連する問題