irbでよくやる事

Windows+R」でファイル名を指定して実行
irb」でirbを起動

irb(main):001:0> require "pp" #.irbrcファイルで起動時にrequireする設定にすれば楽
=> true

irb(main):002:0> str = "abcde" #適当に文字列で何かテストしたい時
=> "abcde"

irb(main):003:0> arr = (1..10).to_a #適当に配列で何かテストしたい時
=> [1,2,3,4,5,6,7,8,9,10]

## この辺からよくやるtips オブジェクトのクラスと、使えるメソッドの確認

irb(main):004:0> str.class  #オブジェクトのクラスを確認
=> String

irb(main):005:0> arr.class  #オブジェクトのクラスを確認 配列は当然Array
=> Array

irb(main):006:0> str.methods #定義されているメソッドを確認
=> ["",・・・,""] #略

irb(main):007:0> str.methods.sort #上記の物をちょっと見やすく、アルファベット順にする
=> ["",・・・,""] #略 ソートされて表示される

irb(main):008:0> pp str.methods.sort #上記の物をもっと見やすく1行に1メソッド表示する
["",
・・・,
""] #略
=> nil


## 更にそれっぽいメソッドを探したい時

##例1  ?で終わる真偽値を返しそうなメソッドの一覧が欲しい

irb(main):009:0> str.methods.grep(/\?$/).sort #末尾が?で終わるメソッドの一覧
["xx?",
・・・,
"yy?"] #略
=> nil


##例2  !で終わる破壊的に動作しそうなメソッドの一覧が欲しい
irb(main):010:0> str.methods.grep(/!$/).sort #末尾が!で終わるメソッドの一覧
["xx!",
・・・,
"yy!"] #略
=> nil


##例3  to_を含む、別のオブジェクトに変換しそうなメソッドの一覧が欲しい
irb(main):011:0> str.methods.grep(/to_/).sort #to_を含むメソッドの一覧
["to_a","to_f","to_i","to_s","to_str","to_sym!"]
=> nil


##例4 nで始まるメソッドの一覧が欲しい
irb(main):012:0> str.methods.grep(/^n/).sort #nで始るメソッドの一覧
["next","next!","nil?"] 
=> nil

こんな事をよくしてます。

オブジェクトのインスタンスにどんなメソッドが実装されているかを確認して、
いっぱいあったらざっくり見た上で、必要な動作をしそうなメソッドが無いかを探す。
知らないけれど、名前的にそんな動作するんじゃないか?と思える物を見つける。
もしくは何となく気になったものを見つける。

そういったメソッドを、irbでどう動作するか試してみる。
思い通りの結果が返ったら、引数やレシーバを変えて数パターンテストしてみる。

上手く動けば、実装に使う。(後々でちゃんと調べる)
上手く動かない時は、別のメソッドを探す。
名前的に上手く動きそうなのに、引数が足りないとか何か惜しい気がするときはリファレンスを見る。

色々探したけれども、やりたい動作をしてくれない予感がしたら、
ぐぐって目的に対して参考になるソースを探す。
見つけたらirbで試したりリファレンスを見る。

って感じ。



メソッドによって、結果を配列を返したり、
何らかの違ったクラスのオブジェクトで返す事もあるので、
そういった場合は再度 .class で確認してループ。
そうする事で色々見えてきて、自分の中ではこれが確認の基本としている。


先日、Hashにmap!メソッドあったっけ?って話題(だったかな?)がちらっと出て、
無かったような…と思いirbを立ち上げて確認した。

その際はこんな感じ

irb(main):001:0> h = {}
=> {}

irb(main):002:0> h.class
=> Hash

irb(main):003:0> h.methods.grep(/^m/).sort
=> ["map", "max", "member?", "merge!", "method", "methods", "min"]

破壊的なのは無さそうだねと結論。

irb(main):004:0> require "active_support"としても
=> true

irb(main):005:0> h.methods.grep(/^m/).sort
=> ["many?", "map", "max", "member?", "merge!", "metaclass", "method", "methods", "min"]

2つ増えるくらいで、やっぱり無さそう。
.map!だと、NoMethodErrorが起きちゃうね。

念のため、grepせずに
h.methods.sort
で全部表示してざっくり確認もする。

これで、1個バグが出るコードも潰せましたと。




ココまでは基本的にRuby環境でのテスト。
Rails環境で、自分で定義したModelなどを使いたい場合は、

Windows+R」でファイル名を指定して実行
「cd パス」でapplication_rootフォルダまで移動して、
ruby script/console」でRails環境でコンソールを起動
で試す。

色々読み込んで起動が遅いのと、
Railsの拡張メソッドかRubyでも使えるメソッドかわからない場合があるので、
自分の場合は基本的にはirbで先に色々試して、使い分けます。
起動早いし。

必要に応じて、irb環境で
require "active_support"やら
require "active_record"やらしてみる。

自前のmodelで実際にfindしたり、
その結果に対しての動作を試したいときには真っ先にrails環境のscript/consoleって感じ。