1
votes

Pourquoi suis-je incapable de modifier les valeurs de ce hachage?

J'essaye de créer un nouveau hachage appelé $ player [: abil_mods] qui est basé sur mon hachage $ player [: abils] . Il doit prendre chaque valeur, soustraire 10, diviser par 2 et l'attribuer à une clé identique dans le nouveau hachage. Cependant, il ne semble pas modifier les valeurs dans $ player [: abil_mods] .

Mon code:

abil_mods: {str: 20, con: 20, dex: 14, wis: 12, int: 8, cha: 8}

devrait créer le hachage $ player [: abil_mods] suivant:

abil_mods: {str: 5, con: 5, dex: 2, wis: 1, int: -1, cha: -1}

mais il crée à la place:

$player = {
  abils: {str: 20, con: 20, dex: 14, wis: 12, int: 8, cha: 8},
  abil_mods: {}
}

$player[:abil_mods] = $player[:abils].each { |abil, pts| ((pts - 10) / 2).floor }


1 commentaires

Il y a de fortes chances que l'utilisation d'un $ player global ne soit pas la bonne chose à faire. La grande majorité du temps, les gens utilisent des globaux lorsqu'ils ne comprennent pas la portée des variables, car un global contournera les problèmes de portée, mais cela ouvre un grand trou pour les bogues et les problèmes plus tard dans votre code. Je recommanderais de passer plus de temps à comprendre pourquoi, et pourquoi pas, vous devriez les utiliser.


3 Réponses :


1
votes

Utilisez simplement map au lieu de each dans cette ligne:

$player[:abil_mods] = $player[:abils].map { |abil, pts| ((pts - 10) / 2).floor }

chacun parcourt le tableau mais renvoyez le tableau d'origine. Alors que map renvoie les nouvelles valeurs.

Btw: Utiliser des variables globales (celle avec le $ ) est presque à chaque fois une mauvaise idée. L'utilisation d'instances de variables locales est préférable.


2 commentaires

Gotcha, merci. Pourquoi utiliser des variables globales est-il une mauvaise idée? J'ai seulement entendu dire que ce n'est pas très Ruby de les utiliser.


Le problème avec les variables globales est que, non seulement elles sont visibles n'importe où dans le code d'un programme, mais elles peuvent également être modifiées de n'importe où dans l'application. Cela peut rendre difficile le suivi des bogues. Je dirais qu'une telle variable globale et un tel état global sont une odeur de code.



1
votes

Le problème est que dans la ligne

$player[:abil_mods] = $player[:abils].map { |k, pts| [k,  ((pts - 10) / 2).floor] }.to_h

vous attribuez la valeur de retour de la méthode Hash # each qui est self au Hash $ player à la touche : abil_mods . Dans votre cas, le Hash est référencé par $player[:abils .

Vous pouvez utiliser Enumerable # map qui renvoie un tableau qui peut être facilement converti en hachage:

$player[:abil_mods] = $player[:abils].each { |abil, pts| ((pts - 10) / 2).floor }


0 commentaires

2
votes

Je suis presque sûr que #each renvoie le hachage sur lequel il fonctionne. (Du moins, c'est ainsi que cela fonctionne sur les tableaux ...) Il s'agit plus de faire quelque chose avec chaque entrée que de renvoyer les résultats de ce quelque chose.

Vous pouvez essayer à la place:

< pré> XXX


0 commentaires