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

时间:2016-10-12 18:55:41

标签: ruby methods parameters arguments truthiness

我有这个方法

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?

我写的程序很长,考虑到每一个案例需要太多的代码行。

感谢您的帮助!

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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))方法顶部的输入,那么它将是不可变的。

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