From: "ko1 (Koichi Sasada)" Date: 2013-02-18T09:15:21+09:00 Subject: [ruby-core:52419] [ruby-trunk - Feature #7872] `block_given?` does not work inside `define_method` Issue #7872 has been updated by ko1 (Koichi Sasada). Assignee set to matz (Yukihiro Matsumoto) (a) def...end and (b) define_method(...){...} is completely different. (1) On (b), outer scope a = 1 define_method(:foo) do p a # access to outer scope end (2) (1) means that the passed block is outer block class C; end def def_method mid C.module_eval{ define_method(mid) do p block_given? yield if block_given? end } end def_method(:foo) obj = C.new obj.foo obj.foo{p 1} def_method(:bar){p :def_foo} obj.bar obj.bar{p 2} #=> false false true :def_foo true :def_foo (3) You can pass block using block parameter define_method(:foo){|&b| p [b, block_given?] } foo #=> [nil, false] foo{} #=> [#, false] ---------------------------------------- Feature #7872: `block_given?` does not work inside `define_method` https://bugs.ruby-lang.org/issues/7872#change-36474 Author: alexeymuranov (Alexey Muranov) Status: Open Priority: Normal Assignee: matz (Yukihiro Matsumoto) Category: core Target version: next minor =begin Is this the expected behavior? define_method :try do block_given? ? yield : 'no block' end try { 'block' } # => "no block" However: def try_again block_given? ? yield : 'no block' end try_again { 'block' } # => "block" =end -- http://bugs.ruby-lang.org/