-1

私はこの方法を持っています

def forest(sword, armour, ring)

trueまたはfalse値を持つ引数を使用して、メインプログラムで次のように宣言します

forest false, false, false

プログラム中に、sword=true && armour=trueRuby が引数が true か false かを自動的に評価する方法はありますか? のようなものを書くことができますか

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

私が書いているプログラムは非常に長く、すべてのケースを考慮するにはコード行が多すぎます。

助けてくれてありがとう!

4

2 に答える 2

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

これで、 のインスタンスを宣言できますForest

forest = Forest.new

false明示的に記述しない限り、すべての変数のデフォルトは ですtrue

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

forest.sword #=> false
forest.sword = true
forest.sword #=> true
于 2016-10-12T19:28:13.013 に答える
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

これは意図したものである場合とそうでない場合があります。「副作用のない」コードを書きたい場合は、これに注意する必要があります。

delete_nil_valuesを使用してメソッドの上部で入力を「複製」options = Marshal.load(Marshal.dump(options))すると、不変になります。

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

于 2016-10-12T19:28:21.127 に答える