我有一个包含许多命名参数的方法,其中一些具有默认值:
def myClass
def initialize(a:, b:, c:, d:, e:, f:, g: nil, h: nil, i: nil)
...
end
end
列表有点难以理解和理解。我正在寻找使这更简单的方法。
使用args的哈希,
myClass.new(**args)
有效,但我不能同时拥有和没有值的符号。
有没有办法让这更简单?
答案 0 :(得分:0)
你可以试试这个
def myClass
def initialize(args)
[:a, :b, :c, :d, :e, :f].each do |a|
raise ArgumentError.new unless args.has_key?(a)
end
...
end
end
args
是一个哈希对象。
答案 1 :(得分:0)
可能存在函数需要如此大量参数的情况,但通常这表明函数在一个地方做了太多事情。
好的,如果你想这样做,我会把它转移到一个特殊的私有方法中:
class MyClass
def initialize(*args)
args = set_defaults(args)
end
private
def set_defaults(args)
# step 1: extract the options hash and check the keys,
# if a key doesn't exist so put it in with the default value
options = args.extract_options!
[g: :state, h: 'a name', i: 5].each do |key, value|
options[key] = value unless options.key?(key)
end
# step 2: check the other array elements
[:a, :b, :c, :d, :e, :f].each do |element|
raise ArgumentError.new unless args.include?(element)
end
# step 3: put them all together again
args << options
end
end
顺便说一句:def className
不起作用。它是class ClassName
。另外请看看漂亮的ruby style guide - naming。