2015-12-03 4 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