yamazのRails日記 このページをアンテナに追加 RSSフィード

2006-08-29irbとリファレンスマニュアルの統合 このエントリーを含むブックマーク

鳥頭な私なのですが,Rubyのメソッド名を思い出すのがつらいです.

そんなアナタirb!Completion機能を使うとメソッド名の補完をしてくれて便利です.

irbRuby標準で入ってます.

% irb -r 'irb/completion'
irb(main):001:0> Array.new.in # ここでArray.new.inまで打ってタブを打つと候補一覧が出る.
Array.new.include?               Array.new.inspect_mode
Array.new.included_modules       Array.new.inspect_mode=
Array.new.indent                 Array.new.install_alias_method
Array.new.index                  Array.new.instance_eval
Array.new.indexes                Array.new.instance_method
Array.new.indices                Array.new.instance_methods
Array.new.infinite?              Array.new.instance_of?
Array.new.initialize_input       Array.new.instance_variable_get
Array.new.inject                 Array.new.instance_variable_set
Array.new.ino                    Array.new.instance_variables
Array.new.insert                 Array.new.integer?
Array.new.inspect                Array.new.intern
Array.new.inspect?               Array.new.invert
irb(main):001:0> Array.new.in

これでArrayインスタンスメソッドでinから始まる奴を全部表示してくれます.

さらに鳥頭な私なのですが,メソッドがどういう引数とるのかわすれちゃいます.

そんなあなたにrefe

http://www.ruby-lang.org/ja/man/index.cgi?cmd=view;name=ReFe

(Refeは標準ではインストールされてないので,上記ページを参照してください)。

%refe Array,concat
Array#<<
--- self << obj

    obj を配列の末尾に追加します。Array#push と同じ効果です。

      ary = [1]
      ary << 2
      p ary      # [1, 2]

    またこのメソッドは self を返すので、以下のように連続して
    書くことができます。

      ary = [1]
      ary << 2 << 3 << 4
      p ary   #=> [1, 2, 3, 4]

こんな感じで簡単なマニュアルを出力してくれます.

でも「どうせだったら一緒に使いたい!」というわけでirbrefeを組み合わせてみました.

doc-extention.rb

class Object
  def method_missing(method_name, *arg)
    if (/(.+)_/ =~ method_name.to_s)
      real_method_name = $1
      class_name = self.class.name  
      if class_name == "Class" # if class method
        class_name = self.name
        cmd = "refe #{class_name}.#{real_method_name}"
      else
        cmd ="refe #{class_name},#{real_method_name}"
      end
      print `#{cmd}`
    else
       super(method_name, *arg)
     end  
  end
end

このファイル適当な名前(今回はdoc-extention.rb)で保存して適当ディレクトリに置きます(今回はtest).

% irb -r 'irb/completion' -I test -r 'doc-extention'
irb(main):001:0> Array.new.in # ここでArray.new.inまで打ってタブを打つと候補一覧が出る.
Array.new.include?               Array.new.inspect_mode
Array.new.included_modules       Array.new.inspect_mode=
Array.new.indent                 Array.new.install_alias_method
Array.new.index                  Array.new.instance_eval
Array.new.indexes                Array.new.instance_method
Array.new.indices                Array.new.instance_methods
Array.new.infinite?              Array.new.instance_of?
Array.new.initialize_input       Array.new.instance_variable_get
Array.new.inject                 Array.new.instance_variable_set
Array.new.ino                    Array.new.instance_variables
Array.new.insert                 Array.new.integer?
Array.new.inspect                Array.new.intern
Array.new.inspect?               Array.new.invert
irb(main):001:0> Array.new.inject_ # メソッドの後に_(アンダースコア)を入れて
                                   # リターンするとドキュメントが出る.
Array < Enumerable#inject
--- inject([init]) {|result, item| ... }   ruby 1.7 feature

    最初に初期値 init と self の最初の要素を引数にブロック
    を実行します。2 回目以降のループでは、前のブロックの実行結果と 
    self の次の要素を引数に順次ブロックを実行します。そうして最
    後の要素まで繰り返し、最後のブロックの実行結果を返します。

    要素が空の場合は init を返します。

    初期値 init を省略した場合は、最初に先頭の要素と 2 番目の要
    素をブロックに渡します。この場合、要素が 1 つしかなければブロック
    を実行せずに最初の要素を返します。要素が空なら nil を返しま
    す。

    : 例
      合計の計算
        p [1,2,3,4,5].inject(0) {|result, item| result + item }
          => 15

      これは以下のように書くのと同じです。
          result = 0
          [1,2,3,4,5].each {|v| result += v }
          p result
          => 15

=> nil
irb(main):004:0> 

_(アンダースコア)をメソッド名の後に書くのがミソです.これで

irbでメソッドを確認しながらコードがかけるようになりました.

うーん.「そこそこ快適」.と思ったらCompletionが効かなくなった!

うーん。どうしよう。と思ったら気のせいだった!

でも上記実装は?がつくメソッドは拾えないので,もうちょっと改良が必要そうです.

WesleymopWesleymop2018/08/01 05:55здесь на вышеприведенном веб-портале <a href=http://da-hostel.ru/>http://da-hostel.ru/</a> подобран громадный ассортимент эксклюзивных статей о туризме.

トラックバック - http://rubyist.g.hatena.ne.jp/yamaz/20060829