Splat(*)运算符和attr_extras gem

时间:2016-11-16 16:54:01

标签: ruby rubygems

前段时间我发现attr_extras gem可用于创建类属性。

写作:

class Foo
  attr_private_initialize :bar
end

取代:

class Foo
  def initialize(bar)
    @bar = bar
  end

  private

  attr_reader :bar
end

我的问题是,attr_extras gem支持在构造函数中处理splat(*)运算符吗?

我想得到以下结果:

def initialize(*bar)
  @bar = bar
end

我没有看到这个功能有记录,所以我认为这是不可能的,但也许有人知道如何使用这个宝石吗?

1 个答案:

答案 0 :(得分:1)

不,它不支持。这是the code

简而言之,考虑到初始化程序的动态特性,已经将所有参数定义为splatted数组,然后将其分成单个值(用于读者和诸如此类的东西)。你不能拥有嵌套的splats,所以这个gem是不可能的(无论如何都是当前的实现)。

klass.send(:define_method, :initialize) do |*values|
  validate_arity.call(values.length, self.class)

  names.zip(values).each do |name_or_names, value|
    if name_or_names.is_a?(Array)
      hash = value || {}

      known_keys = name_or_names.map { |name| name.to_s.sub(/!\z/, "").to_sym }
      unknown_keys = hash.keys - known_keys
      if unknown_keys.any?
        raise ArgumentError, "Got unknown keys: #{unknown_keys.inspect}; allowed keys: #{known_keys.inspect}"
      end

      name_or_names.each do |name|
        set_ivar_from_hash.call(self, name, hash)
      end
    else
      name = name_or_names
      instance_variable_set("@#{name}", value)
    end
  end

  if block
    instance_eval(&block)
  end
end