2016-10-26 1 views
1

Je suis venu récemment à travers le code Ruby suivant, qui me confond:En utilisant les mots-clés de `or` de Ruby lors de la création d'une variable

def initialize(kind, street_1, street_2, city, state, postal_code) 
    @kind = kind or '' 
    @street_1 = street_1 or '' 
    @street_2 = street_2 or '' 
    @city = city or '' 
    @state = state or '' 
    @postal_code = postal_code or '' 
end 

Je ne comprends pas quel rôle or joue dans ce code. Quelqu'un peut-il expliquer s'il vous plaît?

Répondre

5

EDIT: Il convient de noter que le mot-clé or ne fonctionne pas dans ce scénario, mais l'intention est correcte - à l'aide || au lieu de or dans cet exemple produira la sortie désirée.

Le mot-clé or dans ce code implique que si le paramètre étant affecté à la variable locale (c.-à-kind et @kind respectivement) est nil, la valeur de la variable locale doit être initialisé à ''

Une autre façon de regardez cette - si je l'appelle Class.new("something", "1800 Wallaby Way", nil, nil, nil, nil), la classe sera initialisé en tant que tel:

@kind = "something" 
@street_1 = "1800 Wallaby Way" 
@street_2 = '' 
@city = ' 
@state = '' 
@postal_code = '' 
+1

Non seulement 'nil', mais' false' aussi (les deux valeurs qui évaluent 'false' dans Ruby) – jayelm

+0

Point merveilleux, merci! – CalmBit

+0

Hrm. C'est parfaitement logique, mais cela ne semble pas correspondre à ce que je vois quand je le mets à l'épreuve. C'est-à-dire que je change une ligne de la méthode 'initialize' à la place:' @state = state ou "TX" '. Maintenant, disons que j'appelle 'Class.new (" quelque chose "," 1800 Wallaby Way ", néant, néant, néant, néant)'. Après avoir fait tout cela, si j'appelle alors 'puts' sur' @ state', ne vous attendez pas à ce que la sortie soit 'TX'. Je le ferais, mais cela ne semble pas être le cas. Au lieu de cela, la sortie est vide, ce qui indique que le mot clé 'or' n'est * pas * pris en compte. Mon code: https://repl.it/EGO0/0 – filmnut

0

Il est Additionnant dans les paramètres par défaut si vous ne le spécifiez pas toutes les variables lorsque vous créez une nouvelle instance o f ce qui semble être un objet "adresse".

Par exemple.

x = Address.new() 

x.kind == '' 

# evaluates to true 
+0

Essayez de ne pas placer d'espaces entre les noms de méthodes et leurs arguments. Cela peut causer de gros problèmes. – tadman

3

Vous avez trois façons de résoudre ce problème. Le premier est d'utiliser des crochets pour rendre le or lâche contraignant ne pas perdre son emprise sur les valeurs:

@kind = (kind or '') 

La seconde est d'utiliser l'|| opérateur équivalent fortement contraignant:

@kind = kind || '' 

La troisième option , ce qui est le meilleur, est de ne pas prendre soin et juste face:

@kind = kind.to_s 

de cette façon, nil sera automatiquement converti en une chaîne vide si c'est le comportement que vous voulez.

+0

Bonne explication, mais il serait inhabituel de voir # 1 (que la plupart Rubiest considérerait comme inférieure à # 2). Une autre option serait '@kind = kind? genre: '' '. Bien que plus long que les autres, il peut être plus expressif. –

+0

Je ne suis pas sûr que le ternaire ajoute un sens significatif là-bas, et en fait pourrait-on se demander pourquoi il est si répétitif. – tadman