我有这个方法
def forest(sword, armour, ring)
其参数包含true
或false
值,我在主程序中声明为
forest false, false, false
如果在程序sword=true && armour=true
期间,Ruby是否有办法自动评估参数是真还是假?
我可以写点像
forest sword-truth-value, armour-truth-value, ring-truth-value?
我写的程序很长,考虑到每一个案例需要太多的代码行。
感谢您的帮助!
答案 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)
值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))
方法顶部的输入,那么它将是不可变的。
总结:函数在运行时计算其参数。因此,如果您的代码中的副作用可能已经发生变异,那么它的变量将与您在但中传递的变量相同。