前段时间我发现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
我没有看到这个功能有记录,所以我认为这是不可能的,但也许有人知道如何使用这个宝石吗?
答案 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