値true
とfalse
はアトミックです。それらをリテラル値として渡したくない場合は、変数を設定する必要があります。
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))
すると、不変になります。
要約すると、関数は実行時に引数を評価します。したがって、その変数は渡したものと同じになりますが、コードに副作用がある場合、変数が変更されている可能性があります。