Je veux faire quelque chose du genre:

lookup_value = :f
dict = {a: 20, b: 30, c: 40}
res = dict[lookup_value] | raise 'not found'

Comme dans l'exemple ci-dessus, si la clé n'est pas trouvée dans le dictionnaire, je souhaite signaler une erreur. Je pourrais avoir juste une ligne supplémentaire qui dit raise 'not found' unless res, mais je veux vraiment utiliser la recherche dans une expression:

output = 'prefix' + (dict[lookup_value] | raise 'not found')

Le problème est que l'utilisation de raise de cette manière n'est pas une syntaxe valide. Je recherche un moyen de générer une erreur dans une expression si la recherche de la valeur dans le hachage échoue sans avoir à déclarer des variables supplémentaires ou à effectuer une vérification au préalable.

La syntaxe suivante est valide et lèvera une exception si la valeur n'est pas trouvée, mais renvoie nil lorsqu'une valeur est trouvée:

res = (raise 'not found' unless dict[lookup_value])
0
mydoghasworms 23 mai 2018 à 09:45

3 réponses

Meilleure réponse

dict.fetch(lookup_value) est comme dict[lookup_value], mais augmentera si la clé était manquante.

Vous pouvez également faire approximativement ce que vous avez dans la question, avec quelques ajustements: dict[lookup_value] || raise('not found') - cela vous donne le contrôle de l'exception.

3
matthewd 23 mai 2018 à 06:49

En plus de @matthewd, vous pouvez contrôler raise avec fetch de cette manière:

dict.fetch(lookup_value) { raise 'not found' }
1
Alex Golubenko 23 mai 2018 à 07:56

Cela devrait corriger le retour nil lorsqu'une valeur est trouvée.

Changer ceci:

res = (raise 'not found' unless dict[lookup_value])

En cela:

raise 'not found' unless res = dict[lookup_value]
0
iGian 23 mai 2018 à 07:31