@kyanny's blog

My thoughts, my life. Views/opinions are my own.

Ruby: irb にも help() メソッドがある

Kaggle の Learn Python Tutorials | Kaggle コースでは「help() 関数は Python で最も重要な関数である」と激推しされていた help() 関数、使ってみるとたしかにとても便利で、Ruby にもあったらいいのにと思ったらちゃんとあった。

library irb (Ruby 3.0.0 リファレンスマニュアル)

試してみたところ、ちょっとコツが必要だった。Ruby 3.0.0 (MRI) の irb で試した。

irb(main)> help String #=> OK
irb(main)> help(String) #=> OK

irb(main)> help String#match #=> NOT OK String クラスのヘルプが表示される
irb(main)> help(String#match) #=> NOT OK ヘルプが出ない

irb(main)> help 'String#match' #=> OK
irb(main)> help('String#match') #=> OK

irb(main)> help ObjectSpace.each_object #=> NOT OK NoMethodError (undefined method `cache' for nil:NilClass)
irb(main)> help ObjectSpace::each_object #=> NOT OK NoMethodError ただし TAB キーを連打するとヘルプが出る
irb(main)> help

>> String #=> OK
>> 'String' #=> NOT OK

>> String#match => OK
>> 'String#match' #=> NOT OK

>> ObjectSpace.each_object #=> OK
>> ObjectSpace::each_object #=> OK ↑と同じヘルプが表示される

メソッドや特異メソッドのヘルプを見るときの書き方が、やや統一感を欠く気がする。Python の help() の方が一貫性があって覚えやすい(覚えることが少ないので使う上でつまずきが少ない)。Python は関数もオブジェクトとして他のデータ型と同じように扱えるのに対して、Ruby ではメソッドは Object#method で取り出さないとオブジェクトとして扱えないから、だろうか。String#match のような Ruby のエレガントな表記法はドキュメントを書くときに便利で、Python で仕事してた時期に「Python ではどう書くのか?」がわからなくて困ったことがある(Class.method のように書く、と聞いたが、スタティックメソッドとの区別はどうするんだろうと疑問が残った)。

あと二つ、Python の help() の方が優れている点がある。一つは些細なことで、Python の help() はインタラクティブモードでヒストリが残るが irb の help() はヒストリが残らない(Ctrl-P で履歴を辿れるか否か)。

もう一つは大きな違いで、Python の help() はクラスのインスタンスに対しても help() を使える。

>>> import tempfile
>>> f = tempfile.TemporaryFile()
>>> help(f)

一方、irb の help() はそれができない。

=> #<Object:0x00007fa4c31ed9c0>
irb(main):002:0> help o
Traceback (most recent call last):
        6: from /Users/kyanny/.anyenv/envs/rbenv/versions/3.0.0/bin/irb:23:in `<main>'
        5: from /Users/kyanny/.anyenv/envs/rbenv/versions/3.0.0/bin/irb:23:in `load'
        4: from /Users/kyanny/.anyenv/envs/rbenv/versions/3.0.0/lib/ruby/gems/3.0.0/gems/irb-1.3.0/exe/irb:11:in `<top (required)>'
        3: from (irb):2:in `<main>'
        2: from /Users/kyanny/.anyenv/envs/rbenv/versions/3.0.0/lib/ruby/3.0.0/rdoc/ri/driver.rb:842:in `display_name'
        1: from /Users/kyanny/.anyenv/envs/rbenv/versions/3.0.0/lib/ruby/3.0.0/rdoc/ri/driver.rb:887:in `display_page'
NoMethodError (undefined method `cache' for nil:NilClass)

インスタンスに対して help() を呼べるのは非常に強力で、Pandas の DataFrame のメソッドを探すときなどに help(df) だけで済む。今操作したい目の前のオブジェクトから直接ヘルプドキュメントを取り出せる感じなので、対話性が高く、作業効率が良い。

2021/09/03 追記: aycabta さんが irb でも「インスタンス変数に対してヘルプを呼べる機能」を追加してくれました(このエントリのコメント欄参照)。