irb tips(仮) メソッド定義は一行で

こんばんは。irb、使ってますか?


irbでは複数行に渡るメソッド定義が可能です。しかし、部分的に修正する場合でも、全て書き直して再定義しなければなりません(たぶん)。


そこで、今回のtipsです。メソッドを定義する際、無理やり一行で記述します。
あとはirbのヒストリー機能を利用するだけです。


■例:初期値と限界値を受け取り、初期値を何度2倍すれば限界値を超えるか調べるメソッド

まず、普通に書くと以下のようになります。

def baibai(ini, limit, print_flag = false)
  bai_count = 0
  val = ini
  loop do
    puts "#{bai_count}:#{val}" if print_flag
    break if val > limit
    val *= 2
    bai_count += 1
  end
  return [bai_count, val]
end

これを無理やり一行にします。

def baibai(i,l,pf=false);bc=0;v=i;loop{puts "#{bc}:#{v}" if pf;break if v>l;v*=2;bc+=1};[bc,v];end

便宜上、変数名や空白は強引に圧縮しています。これをirbに打ち込めば、きちんとbaibaiメソッドが定義されます。


ここで、初期値を2倍でなく3倍したくなりました。そんなときは、上キーを押してヒストリーを表示し、それを修正します。

(上キー押下)
def baibai(i,l,pf=false);bc=0;v=i;loop{puts "#{bc}:#{v}" if pf;break if v>l;v*=3;bc+=1};[bc,v];end

やっぱり4倍したい・・というか何倍するかは実行時に決めたい。

(上キー押下)
def baibai(i,n,l,pf=false);bc=0;v=i;loop{puts "#{bc}:#{v}" if pf;break if v>l;v*=n;bc+=1};[bc,v];end

というように、メソッド定義を(クラス定義も)一行で書くと、部分的な修正が容易です。


■コードの解説(5/11追記)

  • 【省略可能な引数】メソッド定義の引数に代入式を記述すると、省略可能な引数となり、代入した値がデフォルト値となります。(※Ruby1.8では、省略可能な引数の後に省略不可能な引数を記述することはできません)


  • 【if修飾子】○○ if △△ は、「△△が真なら○○を実行する」という意味です。通常のif文に比べて記述が簡潔になります。


  • 【最後の式の値が戻り値となる】一行に直す際、「return」を省略しています。returnがない場合、最後の式の値がメソッドの値(戻り値)となるため、意味は変わりません。


■参考
irb - Rubyリファレンスマニュアル
http://www.ruby-lang.org/ja/man/html/irb.html