如何使用默认值重构命名参数

时间:2016-03-15 09:13:24

标签: ruby named-parameters

我有一个包含许多命名参数的方法,其中一些具有默认值:

def myClass
  def initialize(a:, b:, c:, d:, e:, f:, g: nil, h: nil, i: nil)
    ...
  end
end

列表有点难以理解和理解。我正在寻找使这更简单的方法。

使用args的哈希,

myClass.new(**args)

有效,但我不能同时拥有和没有值的符号。

有没有办法让这更简单?

2 个答案:

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