Torihaji's Growth Diary

Little by little, no hurry.

Rubyにおいてあるオブジェクトのインスタンス変数をloopで書く

はじめに

Rubyにおいてタイトルのようなことをやりたい時がありました。

debug目的ですね。

やってたこと

Rubyでnet/httpライブラリ使用する上で uriURI.parseする必要がありました。

そこでuriをparseしたのはいいのですが、インスタンスの情報ってどんなのが入っているんだろうと思い、

調べようとしたのですが、そもそもこのインスタンスはどんな情報があってどの変数を参照したらいいんだろう

とわからなかったので調べて見つけました。

uri.hoge, uri.hgoehgoeみたいな感じで1こ1こやってもよかったのですがダサいなと感じまして。

まずそのインスタンスが持っているインスタンス変数が知りたかったのでそれを一覧で返してくれるような感じがあればベスト。

で結果がこれ。

instance_variables

これをインスタンスに適用させると、インスタンス変数名のシンボルを格納した配列を返してくれます。

配列が帰ってくるのなら次にやることはloopで回してその値を参照すればいいですね。

なのでその要素を使ってinstance_variable_get(要素)を使えば良いです。

なので最終結果はこれ。

app(dev)> uri
=> #<URI::HTTPS https://github.com/login/oauth/access_token>

app(dev)* uri.instance_variables.each do |v|
app(dev)*   p "#{v}: #{uri.instance_variable_get(v)}"
app(dev)> end
"@scheme: https"
"@user: "
"@password: "
"@host: github.com"
"@port: 443"
"@path: /login/oauth/access_token"
"@query: "
"@opaque: "
"@fragment: "
"@parser: #<URI::RFC3986_Parser:0x0000ffff8fae1930>"
=> [:@scheme, :@user, :@password, :@host, :@port, :@path, :@query, :@opaque, :@fragment, :@parser]

という感じで少しスマートにかけました。

めでたし。

終わりに

色々あって面白いですね。