2016-10-12 11 views
-1

、ルビーのための任意の方法があるプログラムsword=true && armour=true中の場合、私は、その引数が私はRubyメソッドの引数 - 真理値を自動的に変更できますか?

forest false, false, false 

としてメインプログラムで宣言true又はfalse値を有するこの方法

def forest(sword, armour, ring) 

を有します引数が真か偽かを自動的に評価しますか? は私が書いているプログラムが非常に長い、それは考慮に一つ一つのケースを取るためにあまりにも多くのコード行を取るだろう

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

ような何かを書くことができます。

ありがとうございました!

+0

私はこの質問を理解しているかどうかわかりませんが、いくつか例を挙げて説明してください。 – davidhu2000

+0

プログラム中、剣は真実の値を変更します。 sword = falseの代わりにsword = trueとし、再度フォレストメソッドを書くと、フォレストを真、偽、偽にする必要があります。しかし、ルビーが剣が真実か偽であるかどうか私に教えてもらいたいのですが?それを行うことができるコマンドはありますか? –

+0

私は今考えていると思いますが、答えは以下の通りです – davidhu2000

答えて

2

あなたが探しているものを達成するには、forestメソッドをクラスにラップし、各引数をインスタンス変数として定義する必要があります。

class Forest 

    attr_accessor :sword, :armour, :ring 

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

end 

だから今、あなたは明示的trueを書きがない限り、すべての変数は、falseにデフォルト設定

forest = Forest.new 
Forestのインスタンスを宣言することができます。

attr_accessorを使用すると、すべての変数にアクセスして設定できます。

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

ありがとうございました! :) –

1

truefalseがアトミックです。あなたがそれらを渡すようにリテラル値を使用しない場合、あなたはそれがあなたの質問に対処すべきであるように思え

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

すなわち、変数を設定する必要がありますが、それは同様に「可変」オブジェクトの概念を導入する価値があるかもしれません。例えば、ハッシュと配列は可変です:

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 

これはあなたが意図しているものかもしれません。あなたが '副作用のない'コードを書こうとするなら、これを知っておくべきです。

options = Marshal.load(Marshal.dump(options))を使用してdelete_nil_valuesメソッドの上部にある入力を「クローン」すると、それは不変になります。

要約すると、関数は実行時に引数を評価します。したがって変数が変更されている可能性があるコードに副作用がある場合、その変数はに渡された変数と同じになりますが、になります。

関連する問題