2013-07-22 1 views
-2

Je suis en train de créer un chiffreur de base qui est sorti dans un tableau et non une chaîne. Je suppose que je dois utiliser la méthode .join mais pour la vie de moi ne peut pas trouver où, sans obtenir une erreur..joindre une sortie de tableau

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

Que fait 'done' dans votre méthode' encrypt_letter'? Cela ne semble pas être défini nulle part. –

+0

Désolé, c'était l'une de mes tentatives pour que ça marche quand j'ai copié le code. – Jadam

Répondre

2

Vous pouvez resserrer votre méthode encrypt_letter en se souvenant que la dernière valeur évaluée dans la méthode est également la valeur de retour.

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

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

En outre, la méthode collect retourne en fait un tableau de toutes les valeurs renvoyées par le bloc (la dernière valeur évaluée par le bloc) donc il n'y a pas besoin d'assigner à une variable dans le bloc. Puisque vous avez le tableau de collect (qui est seulement toutes les lettres chiffrées, appelez join sur ce (et puisque c'est l'évaluation finale de la méthode, il est la valeur de retour).

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

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

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

Techniquement, vous pourriez même juste enlever la variable letters et de le faire en une seule ligne mais je pense personnellement qu'il est un peu plus lisible de cette façon

à mon humble avis.

vous pourriez probablement faire toutes les méthodes de la classe des méthodes puisque vous ne stockent aucun variables d'instance et il ne semble pas y avoir de raison de le garder en dehors de simplement chiffrer une chaîne.

+0

Merci d'avoir pris le temps de m'expliquer cela pour moi. Je m'excuse si c'était une question stupide. – Jadam

+0

Il semble seulement une question stupide une fois que vous voyez la solution. Jusqu'à ce point, il semble très important. =) Je pense que les downvotes que vous avez eues étaient dues au fait qu'il était un peu trop localisé et comment une meilleure compréhension des méthodes Array vous aurait orienté vers votre solution. Comprendre les méthodes disponibles pour Array et Enumerable vous aidera grandement. (Je garde leur documentation dans un onglet de navigateur presque constamment.) =) –

1
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 = cipher[letter.downcase] #each letter passed is crypted here 
    end 

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

    encrypted_letter = [] #define an array to store each encrypted char 

    letters.collect do |letter|   
     encrypted_letter << encrypt_letter(letter) #accumulate encrypted chars in the array 
    end 
    encrypted_letter.join #now time to use join to form a string and return it 
    end 
end 

Encryptor.new.encrypt("something") #=> "fbzrguvat" 
+1

Expliquez à l'OP ce que vous avez fait et pourquoi cela fonctionne. Ne distribuez pas de poisson, expliquez comment pêcher. –

+1

@theTinMan Normalement, c'est un bon conseil, mais pour ce genre de questions, je pense que ce genre de réponse est suffisant. Cela le mérite. – sawa

+1

"Ça le mérite"? Mérite quoi? D'autres personnes, au-delà du PO, les regardent. –

Questions connexes