-2

文字列ではなく配列に出力する基本的な暗号化装置を構築しています。メソッドを使用する必要があると思いますが.join、私の人生では、エラーが発生せずにどこを見つけることができません。

class Encryptor
  def cipher
    {'a' => 'n', 'b' => 'o', 'c' => 'p', 'd' => 'q',
     'e' => 'r', 'f' => 's', 'g' => 't', 'h' => 'u',
     'i' => 'v', 'j' => 'w', 'k' => 'x', 'l' => 'y',
     'm' => 'z', 'n' => 'a', 'o' => 'b', 'p' => 'c',
     'q' => 'd', 'r' => 'e', 's' => 'f', 't' => 'g',
     'u' => 'h', 'v' => 'i', 'w' => 'j', 'x' => 'k',
     'y' => 'l', 'z' => 'm'}
   end

   def encrypt_letter(letter)
     lowercase_letter = letter.downcase
   end

   def encrypt(string)
     letters = string.split("")

     letters.collect do |letter|
       encrypted_letter = encrypt_letter(letter)
     end
   end

end
4

2 に答える 2

2

encrypt_letterメソッドで評価された最後の値が戻り値でもあることを覚えておくことで、メソッドを強化できます。

def encrypt_letter(letter)
  cipher[letter.downcase]
end

Encryptor.new.encrypt_letter('h') #=> "u"

また、collectメソッドは実際には、ブロックによって返されたすべての値 (ブロックによって評価された最後の値) の配列を返すため、ブロック内の変数に割り当てる必要はありません。from の配列があるのでcollect(これは暗号化されたすべての文字でjoinあり、それを呼び出します (そして、それがメソッドの最終的な評価であるため、それが戻り値になります)。

def encrypt(string)
  letters = string.split("")

  letters.collect {|letter| encrypt_letter(letter) }.join
end

Encryptor.new.encrypt("Hello") #=> "uryyb"

技術的には、変数を削除lettersしてすべてを 1 行で実行することもできますが、個人的には、この方法の方がもう少し読みやすいと思います。

私見では:

インスタンス変数を保存しておらず、文字列を暗号化する以外にそれを保持する理由がないように見えるため、おそらくすべてのメソッドクラスメソッドを作成できます。

于 2013-07-22T13:53:07.633 に答える