irohiroki's blog 2

Web apps and Geekies

おれのさぶらいむてきすとのRuby小技

このエントリはおれのさぶらいむてきすと Advent Calendar 2013の5日目です。昨日は@s12btさんのおれのさぶらいむてきすとは日本語検索がうまくできないでした。

今日はいろがRubyで使える小技を紹介します。

ご存知の通り、Rubyではブロックを以下の2つの形で書くことができます。

do end
1
2
3
foo do
  bar
end
ブレース
1
2
3
foo {
  bar
}

ブレースの中が1行の時は、下のように書くことも多いと思います。

1
foo { bar }

仕様上はdo endの方が{}より評価の優先順位が低いだけですが、読んだ時の印象が違うため、使い分けてるRubyistも多いはずです。

そして、最初はdo endで書いたけどやっぱり{}にしたいとか、{}で書いたけどdo endにしたいことって意外とあるんですよね。

でも、実際にやるとちょっと面倒です。doまで行って{に直して、endまで行って}に直して。{}にしてみたら1行にしたくなって、改行も消したり。それなのに、後でやっぱりdo endがよかった、なんてことになると本当に最悪です。

そこでおすすめしたいのが、Ruby Block Converterというプラグイン。Package Controlでインストールしたら、変換したいdoendの間にカーソルを移動しましょう。

1
2
3
foo do
  bar # このへんにカーソルを。
end

そして ctrl + shift + [ すると!!!

1
foo { bar }

こうなります!! すごい!!! 一瞬!!!!

もちろん逆もできます。それどころか、ブロック引数があってもできます。例えば

1
array.each{|e| some_method(e) }

だったら、{}の間にカーソルを移動して ctrl + shift + ] !!!

1
2
3
array.each do |e|
  some_method(e)
end

おおー!! 便利!!! インデントもちゃんと自分の設定に合わせてくれるんですね!!!

なお、do endから{}にしたとき1行になるのは、元が3行のときだけです。つまり、

1
2
3
4
foo do
  bar
  baz
end

のように4行以上のときは

1
2
3
4
foo {
  bar
  baz
}

になります。なんて頭がいいんでしょう……

もちろんSublime Textですから、カーソルが複数あっても大丈夫です!! 全てのカーソルの場所でブロックを変換してくれます!!!

Rubyを使う人は是非Ruby Block Converterをインストールして、この気持ちよさを味わってくださいね!!!

明日は@kei_qさんです。よろしくお願いします!