方法:使用默认值循环参数
Method: Loop Through Arguments with Defaults
我正在构建一个 Ruby 对象,其 initialize
方法中的参数具有默认值:
attr_accessor :one, :two, :three
def initialize(one: nil, two: nil, three: nil)
@one = one
@two = two
@three = three
end
如您所见,这不是很 DRY,尤其是随着可初始化变量数量的增加。最终,我希望能够遍历每个参数并分配一个实例变量(splat 运算符和 instance_variable_set
的某种组合?),但总是有一个定义的预期实例变量列表,如果它们具有默认值未定义。
通常情况下,初始化方法需要一大堆参数通常会导致使用选项散列而不是 splat。
使用选项散列,您可以用一种非常ruby的方式干涸您的初始化方法、设置实例变量和attr_readers:
class Animal
def initialize(opts = {})
options = defaults.merge(opts)
options.each do |k, v|
instance_variable_set("@#{k}", v)
self.class.send(:attr_reader, k)
end
end
private
def defaults
{
type: nil,
age: 100,
name: "Unknown"
}
end
end
animal = Animal.new(type:'cat', age: 99)
puts animal
puts animal.type
puts animal.age
puts animal.name
输出:
#<Animal:0x007f9773132650>
cat
99
Unknown
我正在构建一个 Ruby 对象,其 initialize
方法中的参数具有默认值:
attr_accessor :one, :two, :three
def initialize(one: nil, two: nil, three: nil)
@one = one
@two = two
@three = three
end
如您所见,这不是很 DRY,尤其是随着可初始化变量数量的增加。最终,我希望能够遍历每个参数并分配一个实例变量(splat 运算符和 instance_variable_set
的某种组合?),但总是有一个定义的预期实例变量列表,如果它们具有默认值未定义。
通常情况下,初始化方法需要一大堆参数通常会导致使用选项散列而不是 splat。
使用选项散列,您可以用一种非常ruby的方式干涸您的初始化方法、设置实例变量和attr_readers:
class Animal
def initialize(opts = {})
options = defaults.merge(opts)
options.each do |k, v|
instance_variable_set("@#{k}", v)
self.class.send(:attr_reader, k)
end
end
private
def defaults
{
type: nil,
age: 100,
name: "Unknown"
}
end
end
animal = Animal.new(type:'cat', age: 99)
puts animal
puts animal.type
puts animal.age
puts animal.name
输出:
#<Animal:0x007f9773132650>
cat
99
Unknown