2010-05-09 5 views
5

En général, ce qui est préférable d'utiliser ?:Utilisez hachage ou cas déclaration [Ruby]

case n 
when 'foo' 
result = 'bar' 
when 'peanut butter' 
result = 'jelly' 
when 'stack' 
result = 'overflow' 
return result 

ou

map = {'foo' => 'bar', 'peanut butter' => 'jelly', 'stack' => 'overflow'} 
return map[n] 

Plus précisément, quand dois-je utiliser des déclarations de cas et quand je simplement utiliser un hachage?

+0

Cela ressemble à des choses étranges à comparer. Le cas est logique et le hachage est une structure de données. Avez-vous un exemple spécifique où vous essayez de décider lequel utiliser? Le contexte aidera les gens à fournir une réponse utile. – Greg

+0

En règle générale, l'instruction return peut être (et est souvent) omise dans les méthodes ruby. Dans le cas de votre premier exemple, vous pouvez supprimer les instructions return et l'affectation à la variable 'result', en supposant que vous ne fassiez rien avec' result' autre que de le renvoyer. –

+2

J'ai parfois utilisé l'approche de user94154, même si c'est un peu bizarre. Je ne pense pas que ce soit une question stupide. –

Répondre

11

Un hachage est une structure de données et une instruction case est une structure de contrôle.

Vous devez utiliser un hachage lorsque vous récupérez simplement des données (comme dans l'exemple fourni). Si une logique supplémentaire doit être effectuée, vous devez écrire une instruction case.

De plus, si vous devez effectuer une correspondance de motif, il est logique d'utiliser une déclaration de cas:

 

#pattern matching using ranges 
letterGrade = case score 
    when 0..64 then "F" 
    when 65..69 then "D" 
    when 70..79 then "C" 
    when 80..89 then "B" 
    when 90..100 then "A" 
    else "Invalid Score" 
end 

#pattern matching using regular expressions 
case songData 
    when /title=(.*)/ 
    puts "Song title: #$1" 
    when /track=(.*)/ 
    puts "Track number: #$1" 
    when /artist=(.*)/ 
    puts "Artist name: #$1" 
end 

 
8

En général, « mieux » signifie dans la programmation des choses différentes. Par exemple, un meilleur programme

  1. est plus facile à comprendre, à savoir exprime l'intention de mieux
  2. est plus facile à entretenir. Par exemple, moins de lignes de code, moins sujette aux erreurs, etc.
  3. a de meilleures performances, en termes de temps d'exécution
  4. a de meilleures performances, en termes de utilisation de la mémoire

etc Puisque nous parlons de Ruby, les performances sont généralement moins importantes. Si vous avez vraiment besoin de performances, vous pouvez envisager un autre langage de programmation. Donc, je regarderais d'abord les critères (1) et (2). Le meilleur code Ruby représente généralement un "meilleur" programme. Quel code a l'air mieux? Lequel exprime mieux l'intention? Qui serait plus facile à modifier si vous ajoutez/supprimez la logique? Cela dépend de votre problème, et c'est une question de goût, dans une certaine mesure.

Pour moi, dans votre exemple, la solution de hachage est meilleure. La solution de cas fournit plus de flexibilité, dont vous n'avez pas besoin dans ce cas (mais pourrait avoir besoin dans d'autres cas).

3

Il existe deux différences principales entre les tables de hachage et les instructions case.

  1. Une table de hachage peut être stockée, modifiée et réutilisée dans l'environnement lexical, contrairement à une instruction case. Il produit un résultat puis disparaît. Notez cependant que si l'instruction case est dans un bloc/une méthode, elle peut bien sûr être utilisée plusieurs fois en appelant le bloc/la méthode plusieurs fois (mais pas facilement modifiée). Une expression littérale de table de hachage évalue toujours toutes ses clés et valeurs, tandis qu'une instruction case n'évalue que les "clés" dont elle a besoin et la "valeur" qu'elle va renvoyer. C'est souvent la différence la plus cruciale, puisque les valeurs pourraient, comme le souligne Derek B., impliquer une logique supplémentaire, qui pourrait être très coûteuse à effectuer inutilement si une seule des valeurs est nécessaire.

.

case n 
when 'foo' 
'bar' 
when 'peanut butter' 
'jelly' 
when 'stack' 
'overflow' 
end 

C'est équivalent à votre code, et après avoir utilisé Ruby ou langages de programmation fonctionnelle pendant un certain temps, il apparaît beaucoup plus à vous naturel. C'est aussi beaucoup plus court.

Questions connexes