2009-11-15 5 views
3

J'ai quelques variables:Attribution d'une valeur de remplacement en cas de nul

name 
age 
address 
phone 
social_security 
email 
weight 

Et un tableau appelé personal_details avec chacune de ces valeurs dans les positions 0-6.

J'assignez des valeurs comme ceci:

name = personal_details[0] 
address = personal_details[1] 
phone = personal_details[2] 
social_security = personal_details[3] 
email = personal_details[4] 
weight = personal_details[5] 

Dans certains cas, cependant, les données sur le côté droit n'existe pas.

Quelle est une façon plus élégante de gérer cela que d'écrire quelque chose comme ça pour chaque élément du tableau?

if !personal_detail[0].nil? 
name = personal_details[0] 
else 
name = "" 
end 
if !personal_detail[1].nil? 
address = personal_details[1] 
else 
address = "" 
end 

Répondre

10

Vous pouvez le faire depuis une valeur nil retourne false et || n'évaluera la droite si le côté gauche est fausse:

name = personal_details[0] || '' 
2
name = personal_details[0] || "" 
1

Mise à jour: Ceci est incorrect, voir la discussion ci-dessous.

Il y a un moyen intégré pour le faire avec Array#fetch:

personal_details = ['Joe User', nil, '12 Main Street'] 

name = personal_details.fetch(0, '') 
age  = personal_details.fetch(1, '') 
address = personal_details.fetch(2, '') 

Les autres solutions fonctionnent correctement en fonction de l'exemple que vous avez fourni. Si l'une des valeurs du côté droit est définie sur false, l'approche || renvoie la chaîne vide au lieu de la valeur.

+0

Êtes-vous sûr que 'fetch' fonctionne comme vous le pensez? De la docs: Essaie de retourner l'élément à l'index de position. Si l'index * se trouve en dehors du tableau * ... renvoie default. Une expérience rapide avec 'irb' suggère qu'il ne retourne pas la valeur par défaut s'il y a un élément * any * à l'index demandé (même' nil'). Donc ça ne marche pas dans le cas de l'OP, puisqu'il ne s'interroge pas sur les objets au-delà de la fin de son tableau. – Telemachus

+0

Vous avez raison - j'avais testé le code et je n'ai vu rien affiché et je supposais juste qu'il retournait la chaîne vide. Au lieu de cela, il revenait à zéro qui a semblé la même au premier coup d'œil. Je vais éditer la réponse. –

Questions connexes