【Ruby】method(:xxx)と表現するコード(Object#method)について

Ruby

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)やってます。フォローしてもらえるとうれしいです!