2016-11-16 6 views
0

Vor einiger Zeit fand ich, dass attr_extras Gem zum Erstellen von Klassenattributen verwendet werden kann.Splat (*) operator und attr_extras gem

Schreiben:

class Foo 
    attr_private_initialize :bar 
end 

ersetzt:

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

    private 

    attr_reader :bar 
end 

Meine Frage ist, ob attr_extras gem Unterstützung Splat Handling (*) Operatoren in Bauer?

Ich mag folgendes Ergebnis erhalten:

def initialize(*bar) 
    @bar = bar 
end 

ich diese Funktionalität nicht sehen dokumentiert, so dass ich denke, das ist unmöglich, aber vielleicht jemand weiß, wie es zu tun, um dieses Juwel mit?

+0

'initialize' ist nur eine normale Methode, die beim Erstellen von Objekten mit' Class # new' aufgerufen wird. Es ist absolut gültig, wenn Sie "initialize" verwenden. – Aetherus

+0

Ja, aber meine Frage ist, wie das mit attr_extras gem erreicht werden kann. 'attr_private_initialize: * bar' funktioniert nicht. – maicher

Antwort

1

Nein, das wird nicht unterstützt. Hier ist the code.

Kurz gesagt, angesichts der dynamischen Natur des Initialisierers, bereits definiert alle Argumente als Array Splatted und dann zerlegt es in einzelne Werte (in Lesern und whatnot verwendet werden). Sie können keine verschachtelten Splats haben, daher ist es mit diesem Juwel (die aktuelle Implementierung) sowieso nicht möglich.

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 
Verwandte Themen