2016-10-12 2 views
-1

J'ai cette méthodeMéthode Ruby Arguments - Peuvent-ils changer automatiquement la valeur de la vérité?

def forest(sword, armour, ring) 

avec ses arguments ayant true ou false valeurs, que je déclare dans le programme principal comme

forest false, false, false 

Si au cours du programme sword=true && armour=true, est-il un moyen pour Ruby évaluer automatiquement si les arguments sont vrais ou faux? ce que je pourrais écrire quelque chose comme

forest sword-truth-value, armour-truth-value, ring-truth-value? 

Le programme que je vous écris est très long et cela prendrait trop de lignes de code pour prendre tous les cas unique en considération.

Merci pour l'aide!

+0

Je ne suis pas sûr de comprendre la question, pouvez-vous clarifier avec quelques exemples? – davidhu2000

+0

Pendant le programme, l'épée change sa valeur de vérité. Au lieu de sword = false, maintenant sword = true et quand j'écris à nouveau la méthode forest, je devrais écrire forest true, false, false. Mais si je voulais que Ruby me dise si l'épée est vraie ou fausse? Y at-il une commande qui peut faire cela? –

+0

Je pense que j'ai une idée maintenant, je vais travailler sur une réponse ci-dessous – davidhu2000

Répondre

2

Pour obtenir ce que vous cherchez, vous devez envelopper la méthode forest dans une classe et définir chaque argument comme une variable d'instance.

class Forest 

    attr_accessor :sword, :armour, :ring 

    def initialize(sword = false, armour = false, ring = false) 
    @sword = sword 
    @armour = armour 
    @ring = ring 
    end 

end 

Alors maintenant, vous pouvez déclarer une instance de Forest,

forest = Forest.new 

Toutes les variables par défaut à false, à moins que vous écrivez explicitement true.

Avec le attr_accessor, vous pouvez accéder et définir toutes les variables.

forest.sword #=> false 
forest.sword = true 
forest.sword #=> true 
+0

Merci beaucoup pour votre aide! :) –

1

Les valeurs true et false sont atomiques. Si vous ne voulez pas passer des valeurs littérales, vous devez définir une variable, à savoir

is_sword = false 
is_armor = false 
is_ring = false 
forest is_sword, is_armor, is_ring 

Il semble que cela devrait répondre à votre question, mais il pourrait être utile d'introduire les concepts d'objets « mutables » et . Par exemple, les hachages et les tableaux sont mutables:

hash = { armor: false, sword: false, ring: false } 
    def delete_nil_values(options) 
    # delete all key-vals from the hash where the val is falsey 
    options.each_key { |key| options.delete(key) if !options[key]} 
    options 
    end 
    delete_nil_values(hash) 
    puts hash 
    # => {} 
    # it is empty 

Ceci peut être ou ne pas être ce que vous avez l'intention de faire; Si vous voulez écrire un code «sans effet secondaire», vous devez en être conscient.

Si vous "clonez" l'entrée en haut de la méthode delete_nil_values en utilisant options = Marshal.load(Marshal.dump(options)), elle sera immuable.

En résumé: Une fonction évalue ses arguments lors de l'exécution. Donc, ses variables seront les mêmes que celles que vous avez passées dans mais si vous avez des effets secondaires dans votre code, les variables peuvent avoir muté.