--f46d044519991f768104b718d971 Content-Type: text/plain; charset=ISO-8859-1 On Sun, Jan 22, 2012 at 12:38 AM, Adit Cahya Ramadhan Adit < matematika.adit / gmail.com> wrote: > for some reason, I want to change following code: > > class A > def method_name(*args) > if block_given? > # do something with the block > yield(*args) > :block_is_given > else > # do other stuff > :block_not_given > end > end > end > > to this code: > > class A > %w(a b c d).each do |method_name| > define_method(method_name) do |*args| > if block_given? > # do something with the block > yield(*args) > :block_is_given > else > # do other stuff > :block_not_given > end > end > end > end > > But, I get this, > > A.new.a # :block_not_given > A.new.a { "Hello World" } # :block_not_given > > did I miss something? > How do I can get > > A.new.a { "Hello World" } > > to produce # :block_is_given and executes the block? > > -- > Posted via http://www.ruby-forum.com/. > > block_given? gets confused about what context it should be looking in. To get around it, just explicitly accept a block. class A %w(a b c d).each do |method_name| define_method(method_name) do |*args, &block| if block # do something with the block block.call(*args) :block_is_given else # do other stuff :block_not_given end end end end A.new.a # :block_not_given A.new.a { "Hello World" } # :block_is_given --f46d044519991f768104b718d971--