Ruby 方法参数 - 它们可以自动更改真值吗?

Ruby Method Arguments - Can they change truth value automatically?

我有这个方法

def forest(sword, armour, ring)

其参数具有 truefalse 值,我在主程序中将其声明为

forest false, false, false

如果在程序sword=true && armour=true中,有没有办法让Ruby自动判断参数是真还是假? 我可以这样写吗

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

我正在编写的程序很长,需要太多代码行才能考虑到每个案例。

感谢您的帮助!

要实现您的目标,您应该将 forest 方法包装在 class 中并将每个参数定义为实例变量。

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

truefalse 是原子的。如果您不想将它们作为文字值传递,则必须设置一个变量,即

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

这似乎应该可以解决您的问题,但也值得介绍 "mutable" 对象的概念。例如哈希和数组是可变的:

   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

这可能是也可能不是您想要的;如果你想编写 'side effect free' 代码,你应该知道这一点。

如果您 "clone" 使用 options = Marshal.load(Marshal.dump(options))delete_nil_values 方法顶部输入,那么它将是不可变的。

总而言之:函数在运行时计算其参数。因此它的变量将与您在 中传递的变量相同,但是如果您的代码中有副作用,则变量可能已经发生变异。