0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

define_method と block_given?

Posted at

Ruby でメソッドにブロックが与えられているかを確認する、Kernel#block_given?というメソッドがある。

def foo
  p block_given?
end

foo       #=>false
foo {}    #=>true

これが、メソッドをModule#define_methodで定義した場合、使えない。

define_method(:foo) do
  p block_given?
end

foo       #=>false
foo {}    #=>false

というか、そもそもこの場合、yieldが使えないので、ブロックは Procオブジェクトで与えてやることになる。

define_method(:foo) do
  yield
end
#=>Invalid yield (SyntaxError)
define_method(:foo) do |&bk|
  bk.call
end

では、こうするとして、block_given?はどういう手段で代替するか。
それは、ブロックが与えられていない場合、bknilになることを使えば、実現できそうである。

define_method(:foo) do |&bk|
  p bk    #ブロックが与えられていなければnilになる
  bk.call if bk
end

foo       #=>nil
foo {}    #=>#<Proc:0x00007f1464fe6508>

※参考
https://bugs.ruby-lang.org/issues/7872

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?