2013-10-02 4 views
0

Je suis en train de faire le tutoriel rspec de Test First et j'ai une question concernant le problème Pig_Latin.Ruby: Chaînes de caractères dans un traducteur Pig Latin

Spécifiquement je veux savoir sur les gammes de cordes. Voici une partie de mon code:

if phonemes.include?(word[0]) && phonemes.include?(word[1]) && phonemes.include?(word[2]) 
<do something> 
end 

Au lieu de ce qui précède, j'ai essayé:

if phonemes.include?(word[0..2]) # i added that character to the list of phonemes 
    <do something>     # e.g. if the word is school i added "sch" to 
end        # the array called phonemes 

Cependant, il ne fonctionne pas même si "sch" est en phonemes et word[0..2] == "sch"

Ma question est pourquoi Puis-je ne pas utiliser les plages de chaînes pour manipuler le résultat. (Je vais poster mon code complet en bas dans le cas où ce n'est pas clair)

code

(travaux en cours):

def translate(string) 
array = string.split(" ") 
alphabet = ("a".."z").to_a 
vowels = ["a", "e", "i", "o", "u"] 
phonemes = alphabet - vowels 
phonemes << ["qu", "sch", "thr"] 
result = [] 
array.each do |word| 
    if vowels.include?(word[0]) 
     result << (word + "ay") 
    elsif phonemes.include?(word[0..1]) 
     result << "do something" 
    elsif phonemes.include?(word[0]) && phonemes.include?(word[1]) && phonemes.include?(word[2]) 
     result << (word[3..-1] + (word[0..2] + "ay")) 
    elsif phonemes.include?(word[0]) && phonemes.include?(word[1]) 
     result << (word[2..-1] + (word[0..1] + "ay")) 
    elsif phonemes.include?(word[0..1]) 
     result << "do something else" 
    elsif phonemes.include?(word[0]) 
     result << (word[1..-1] + (word[0]+ "ay")) 
    end 
end 
return result.join(" ") 
end 

Comme toujours des conseils pour rendre plus efficace le code serait apprécié (mais le plus chose importante pour moi est de comprendre pourquoi les chaînes de caractères ne fonctionnent pas). Merci.

Répondre

1

Votre instruction phonemes << ["qu", "sch", "thr"] ajoute ce tableau en tant que dernier élément de phonemes, ce qui explique pourquoi le include? échoue. L'opérateur << est conçu pour ajouter des éléments individuels au tableau. Si vous souhaitez ajouter tous les éléments de ce tableau à phonemes, vous pouvez utiliser l'opérateur += à la place.

+0

Génial! C'est parfait, merci beaucoup! –

1

Ceci n'est pas une réponse à votre question principale, mais vous avez demandé des conseils pour améliorer votre code. Je vous suggère d'envisager d'utiliser une déclaration de cas où vous avez votre long if-else. Cela le rend plus lisible et réduit la duplication. Quelque chose comme ceci:

result << case 
    when vowels.include?(word[0]) 
    word + "ay" 
    when phonemes.include?(word[0..1]) 
    "do something" 
    when phonemes.include?(word[0]) && phonemes.include?(word[1]) 
    if phonemes.include?(word[2]) 
     word[3..-1] + word[0..2] + "ay" 
    else 
     word[2..-1] + word[0..1] + "ay" 
    end 
    when phonemes.include?(word[0..1]) 
    "do something else" 
    when phonemes.include?(word[0]) 
    word[1..-1] + word[0]+ "ay" 
    else 
    "do something else or raise an error if you reach this point." 
end 

Je ne regarde pas votre code près, mais j'ai remarqué que vous avez deux fois phonemes.include?(word[0..1]), de sorte que le second ne sera jamais exécutée.

+0

haha ​​oui j'ai vu ça. Je l'ai tellement réécrit et sauvegardé les copies plus anciennes que j'ai été confus. Je viens juste de finir le problème (je n'ai pas encore vraiment regardé son efficacité car je viens juste de finir) mais j'ai nettoyé ce truc. Merci beaucoup pour la réponse, je vais regarder dans ces déclarations. Pour la clarification quelle est la différence entre 'quand 'et' if' et aussi ce qui est 'résultat << case'. plus précisément ce qui est 'case' –

+1

@Sai' when' est un mot-clé utilisé avec l'instruction 'case'. 'case' renvoie une valeur, en fonction de laquelle' when' s'applique. Ici 'case' renvoie une valeur qui doit être ajoutée à' result', comme vous l'avez fait dans votre code. Vérifiez les documents pour l'affaire. –

+0

ok merci beaucoup pour la clarification –

Questions connexes