2010-11-05 13 views
2

Pouvons-nous rendre le code Ruby suivant plus court et en même temps plus lisible?Meilleure façon de définir les valeurs par défaut?

height = do_some_calc 
height = 128 if height == 0 
+0

Je ne suis pas d'accord avec le titre de la question edites, mais je ne connais pas meilleure variante, que le précédent (dans le style de "comment l'écrire mieux/plus court?"). – Nakilon

+0

@Nakilon Je suis d'accord avec vous, mais comme vous l'avez dit, le titre de la question précédente n'était pas très clair. – theIV

Répondre

1

Plus court? Pas et être fonctionnel.

height = (h = do_some_calc).zero? ? 128 : h 

comme dans:

def do_some_calc 
    rand 100 
end 

10.times do 
    height = (h = do_some_calc).zero? ? 128 : h 
    puts height 
end 
# >> 3 
# >> 95 
# >> 89 
# >> 82 
# >> 31 
# >> 4 
# >> 82 
# >> 99 
# >> 11 
# >> 64 
7
height = 128 if 0 == height = do_some_calc 

Il est la seule façon que je sais, si do_some_calc doit être évalué qu'une seule fois.

+0

Assez génial bien que tout le reste mais élégant, +1 – hurikhan77

+0

Et il ne pollue pas l'espace de noms local avec une variable d'aide ... :-) (la plupart des autres solutions font) – hurikhan77

+0

En faveur de la lisibilité je réécrirais ceci comme 'height = 128 if (hauteur = do_some_calc) == 0'. – Max

0

Peut-être que quelque chose le long des lignes de:

STANDARD_HEIGHT = 128 
def do_some_calc 
    height = 0 
    #calculate our height... 
    height = height == 0 ? STANDARD_HEIGHT : calculated_height 
end 

Je pense qu'il doit y avoir plus de contexte donné au 128, d'où la constante. Je pense aussi que do_some_calc devrait cacher le fait que si elle égale 0, il devrait vraiment égaler notre DEFAULT_HEIGHT.

EDIT: Pour répondre à votre question implicite (que j'ai éditée en tant que telle), nous pouvons la rendre plus courte en rendant do_some_calc plus long.

0

Vous pouvez faire comme suit

height = do_some_calc.zero? ? 128 : do_some_calc 
+0

Je crois que le but était d'éviter les appels en double à 'do_some_calc', ce qui pourrait être potentiellement coûteux. – meagar

+1

Eh bien, c'était ma préférence de programmation. Pas spécifiquement indiqué par OP .... mais je devrais le croire pour être vrai. – beach

2

Si vous êtes prêt à modifier do_some_calc de retourner faux ou nul au lieu de 0, alors vous êtes dans les affaires.

height = do_some_calc || 128 

Si vous ne pouvez pas modifier do_some_calc retourner faux ou nul quand il serait normalement retourner 0, alors vous pouvez envelopper, mais vous n'êtes pas sauver beaucoup de personnages à long terme. À l'exception du cas où vous avez plusieurs endroits où vous définissez les valeurs par défaut.

Cette enveloppe retournerait false si do_some_calc renvoyait 0 et la sortie de do_some_calc dans tous les autres cas.

def my_do_some_calc 
    temp = do_some_calc 
    temp != 0 && temp 
end 

Mettre tous ensemble donne:

height = my_do_some_calc || 128 
-4

Ceci est techniquement plus court si peu lisible:

(height = do_some_call) == 0 and height = 128 

Je dirais garder la façon dont vous l'avez, votre chemin semble être le plus concis et lisible.