組込ライブラリ(UnboundMethod)
レシーバを持たないメソッドを表す。
成果物
情報源
UnboundMethod
レシーバを持たないメソッドを表すクラスです。呼び出すためにはレシーバにバインドする必要があります。
Module#instance_method や Method#unbind により生成し、後で UnboundMethod#bind によりレシーバを割り当てた Method オブジェクトを作ることができます。
例: Method クラスの冒頭にある例を UnboundMethod で書くと以下のようになります。
class Foo def foo() "foo" end def bar() "bar" end def baz() "baz" end end # 任意のキーとメソッドの関係をハッシュに保持しておく # レシーバの情報がここにはないことに注意 methods = {1 => Foo.instance_method(:foo), 2 => Foo.instance_method(:bar), 3 => Foo.instance_method(:baz)} # キーを使って関連するメソッドを呼び出す # レシーバは任意(Foo クラスのインスタンスでなければならない) p methods[1].bind(Foo.new).call # => "foo" p methods[2].bind(Foo.new).call # => "bar" p methods[3].bind(Foo.new).call # => "baz" class Foo def foo() "foo" end def bar() "bar" end def baz() "baz" end end # 任意のキーとメソッドの関係をハッシュに保持しておく # レシーバの情報がここにはないことに注意 methods = {1 => Foo.instance_method(:foo), 2 => Foo.instance_method(:bar), 3 => Foo.instance_method(:baz)} # キーを使って関連するメソッドを呼び出す # レシーバは任意(Foo クラスのインスタンスでなければならない) p methods[1].bind(Foo.new).call # => "foo" p methods[2].bind(Foo.new).call # => "bar" p methods[3].bind(Foo.new).call # => "baz"
例: 以下はメソッドの再定義を UnboundMethod を使って行う方法です。普通は alias や super を使います。
class Foo def foo p :foo end @@orig_foo = instance_method :foo def foo p :bar @@orig_foo.bind(self).call end end Foo.new.foo # => :bar # :foo class Foo def foo p :foo end @@orig_foo = instance_method :foo def foo p :bar @@orig_foo.bind(self).call end end Foo.new.foo # => :bar # :foo
メンバ抜粋
インスタンスメソッド
== arity bind bind_call clone eql? hash inspect name original_name owner parameters source_location super_method to_s
所感
何がしたいのか。どういうときに使いたいのか。さっぱりわからん。
対象環境
- Raspbierry pi 4 Model B
- Raspberry Pi OS buster 10.0 2020-08-20 ※
- bash 5.0.3(1)-release
- Ruby 3.0.2
$ uname -a Linux raspberrypi 5.4.51-v7l+ #1333 SMP Mon Aug 10 16:51:40 BST 2020 armv7l GNU/Linux