rubyの勉強をしていくうちに、好ましい記述法や技術が分かってきた。

String#[]

正規表現でマッチした文字を取り出したいだけ時にはmatchメソッドや =^メソッドではなくString型の[]メソッドが最も短く書ける

    p "@@@@@hoge@@@@@"[/[a-z]+/] #=> "hoge"

%記法

パーセント記法はとても便利、場合によってはかなりみやすくなる。

    p %s|symbol|  #=> :symbol
    p %w|abc def gh| #=> ["abc", "def", "gh"]
    p %x|ruby -v| #=> "ruby 2.1.4p265 (2014-10-27 revision 48166) [x86_64-linux]\n"
    p %r|[A-Z]| #=> /[A-Z]/

#map

ある配列から他の配列を作りたいときなどに、以下のようにeachの前で結果を入れるため の配列を初期化しておくのは冗長

    array=[1,2,3,4,5,6]
    array2=[]
    array.each{|i| array2 << i * 2}
    p array2 #=> [2, 4, 6, 8, 10, 12]

以下のようにmapメソッドで関数型言語の流儀で書くべき。

    array=[1,2,3,4,5,6]
    array2 = array.map{|i| i * 2}
    p array2 #=> [2, 4, 6, 8, 10, 12]

条件によって要素を外したい、条件に合う要素のみの配列を作りたい場合にはreject,selectメソッドがよい。
さらに、配列からハッシュを作りたいときなどには、以下のようにreduceメソッドがよい。

    array=[1,2,3,4,5,6]
    hash = array.reduce({}){|h,i| h[i]= i*2; h }
    p hash #=> {1=>2, 2=>4, 3=>6, 4=>8, 5=>10, 6=>12}

case文

case文は===演算子で含有関係が評価されため、単純な一致の場合以外にも使える。
Integerの場合にはRangeがそれを含むかどうかを評価できる。

    i = 10
    case i
    when 1..50
      puts 'small'
    when 51..10
      puts 'big'
    end

Stringの場合には正規表現が使える。

    str = 'dojadf@ss'
    case str
    when /@/
      puts "include @"
    when /[a-z]+/
      puts "only small letter"
    end

begin~end による変数の代入

begin文は例外処理だけでなく、変数の代入に使用する事もできる。

def address
  @address ||= begin
    do_something
    call_address_api @postal_code
  end
end