-1

我有这个方法

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?

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

谢谢您的帮助!

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 回答