2015-12-03 69 views
8

是否可以使用如下所示的塊初始化對象?使用塊初始化對象

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

當然,但不要忘記提供參數。該塊不會做任何事情。 – sawa

回答

14

當然,你可以yieldinitialize內,沒有什麼特別的地方:

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> 

你也可以使用instance_eval評估接收器的情況下塊:

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

如果我想要一個對象可以通過兩種方式實例化:使用塊和構造函數? – DreamWalker

+0

@DreamWalker你可以使參數爲可選的,並且只有在['block_given?'](http://ruby-doc.org/core-2.2.3/Kernel.html#method-i-block_given-3F)時纔會產生。 – Stefan