2015-12-03 12 views
8

Kann ein Objekt wie folgt mit einem Block initialisiert werden?Initialisieren eines Objekts mit einem Block

class Foo 
    attr_reader :bar,:baz 
    def initialize(bar,baz) 
    @bar, @baz = bar, baz 
    end 
end 

Foo.new do |bar, baz| 
    # some logic to be implemented 
    # @bar, @baz to be assigned 
end 
+1

Sicher, aber vergessen Sie nicht, die Argumente anzugeben. Und der Block wird nichts tun. – sawa

Antwort

14

Natürlich können Sie yield aus initialize, gibt es nichts Besonderes an sich:

class Foo 
    attr_accessor :bar, :baz 
    def initialize 
    yield self 
    end 
end 

Foo.new do |f| 
    f.bar = 123 
    f.baz = 456 
end 
#=> <Foo:0x007fed8287b3c0 @bar=123, @baz=456> 

Sie auch den Block im Kontext des Empfängers instance_eval mit auswerten könnte:

class Foo 
    attr_accessor :bar, :baz 
    def initialize(&block) 
    instance_eval(&block) 
    end 
end 

Foo.new do 
    @bar = 123 
    @baz = 456 
end 
#=> #<Foo:0x007fdd0b1ef4c0 @bar=123, @baz=456> 
+0

Was, wenn ich möchte, dass ein Objekt auf beide Arten instanziiert werden könnte: mit einem Block und mit Konstruktor? – DreamWalker

+0

@DreamWalker Sie können die Argumente optional machen und geben nur wenn ['block_given?'] (Http://ruby-doc.org/core-2.2.3/Kernel.html#method-i-block_given-3F). – Stefan

Verwandte Themen