Object#methodについて
Object#methodはレシーバーのメソッドを引数に受け取り、当該メソッドをMethodというオブジェクトに変換するメソッドです。
Methodオブジェクトとしてオブジェクト化されたメソッドはcall
で実行します。
### Integerのabsメソッドをオブジェクト化
> me = -365.method(:abs)
=> #<Method: Integer#abs>
### メソッド(abs)の実行
> me.call
=> 365
call(引数)
とすることで、Methodオブジェクトのメソッドに値を渡せます。
### putsメソッドをオブジェクト化
> put_method = method(:puts)
=> #<Method: main.puts>
### メソッド(puts("hoge"))の実行
> put_method.call('hoge')
hoge
=> nil
Object#methodを利用した具体例
Arrayの要素を出力する
> [1,2,3].each(&method(:puts))
1
2
3
=> [1, 2, 3]
上記のコードは以下と等価です。
> [1,2,3].each { |i| puts i }
1
2
3
=> [1, 2, 3]
URLの文字列に対してHTTPメソッドを実行する
> require "net/http"
> url = "https://nishinatoshiharu.com/"
> url.then(&URI.method(:parse))
.then(&Net::HTTP.method(:get_response))
.code
=> "200"
上記のコードは以下と等価です。
> require "net/http"
> url = "https://nishinatoshiharu.com/"
=> "https://nishinatoshiharu.com/"
### URLの文字列からURIインスタンスを作成
> uri = URI.parse(url)
=> #<URI::HTTPS https://nishinatoshiharu.com/>
### GETリクエストを実行してレスポンスを取得
> response = Net::HTTP.get_response(uri)
=> #<Net::HTTPOK 200 OK readbody=true>
### レスポンスのコードを取得
> response.code
=> "200"
thenはレシーバをブロックの引数として受け取り、ブロックの評価をレシーバに反映させるメソッドです。
thenの詳細解説はRubyのthen(yield_self)の概要と具体的な使いどころで紹介しています。
さいごに
Twitter(@nishina555)やってます。フォローしてもらえるとうれしいです!