Ruby 方法参数 - 它们可以自动更改真值吗?
Ruby Method Arguments - Can they change truth value automatically?
我有这个方法
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?
我正在编写的程序很长,需要太多代码行才能考虑到每个案例。
感谢您的帮助!
要实现您的目标,您应该将 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
值 true
和 false
是原子的。如果您不想将它们作为文字值传递,则必须设置一个变量,即
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
方法顶部输入,那么它将是不可变的。
总而言之:函数在运行时计算其参数。因此它的变量将与您在 中传递的变量相同,但是如果您的代码中有副作用,则变量可能已经发生变异。
我有这个方法
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?
我正在编写的程序很长,需要太多代码行才能考虑到每个案例。
感谢您的帮助!
要实现您的目标,您应该将 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
值 true
和 false
是原子的。如果您不想将它们作为文字值传递,则必须设置一个变量,即
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
方法顶部输入,那么它将是不可变的。
总而言之:函数在运行时计算其参数。因此它的变量将与您在 中传递的变量相同,但是如果您的代码中有副作用,则变量可能已经发生变异。