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

、あなたはinitialize内からyieldが、それについては何も特別なことはありませんすることができます

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

関連する問題