Rubyショートコーディング入門
この記事はIS17erアドベントカレンダー14日目の記事として書かれました。
主にRubyに特有なショートコーディングを載せていきたいと思います。
書いている途中に気づきましたが、こちらの記事に無限に有益情報が載っていたので、ぜひ読んでみてください。
ループ
n.times
他の言語で、for (int i = 0; i < n; i++)に続けて書く作業を
n.times{}
と書くことができます。
n.times{|i| ... }
とするとインデックスをとれます(cookiesさんありがとうございます)。
a..b, a...b
(0...n).each{|i| do_something}
ではiが0からn-1まで動きます。一方
(0..n).each{|i| do_something}
では0からnまで動きます。
loop
while 1
do_something(gets)
end
の代わりに
loop{do_something}
が使えます。
標準入出力編
$<
標準入力の各行について処理を行うときなどに
$<.map{|l|do_something}
みたいにかけて便利です。
$><<hoge
はprint hogeの代わりに使用できます。printと同様文末に改行は入りません。
`dd`
標準入力から取り込みます。getsと違う点は、EOFまで読み込む点です。
print *array
配列の中身を連結して出力します。
print *[1,2,3]
は123となります。
オプション
-n
while 1
do_something(gets)
end
の形をしたプログラムは以下のように書くことができます。
#!ruby -n
do_something($_)
上述したように、loop{}が使えるので、while 1と書く機会はまずありません。
また、この場合だけに限りませんが$_~/hoge/の代わりに~/hoge/と書くことができます。
-p
-nとほぼ同じですが、処理が終了すると、$_の値を出力します。
-a
-naもしくは-paのように使用します。読み込んだ各行をスペースでsplitした配列が$Fに格納されます。
その他
?
?aは'a'と同じです。?1は'1'となります。1文字の文字を宣言するときはこちらのほうが1byte短くなります。
これを利用して、ある文字が文章に含まれているかを短く判定することができます。
'hoge'[?h]は'hoge'=~/h/よりも短いです。
:hoge
シンボルは文字列として出力されます。
puts hoge ?:Yes: :No
とかけます。
puts hoge ?'Yes':'No'
より1byte短くなります。
d[n]
d[n]は整数dを2進数として見た場合の、n桁目(ただし、1の位を0桁目とする)の値を返します。
eval
evalは多くの使いみちがあります。たとえば、何度も使用する処理を文字列として書いておき、それを毎回evalすることで、コードを短くすることができます。
また、gets.to_iよりも
eval`dd`
のほうが短いです。
p
pは出力のときによく使用するやつです。数字を出力するときにはputsではなくpを使用しましょう。また、pはnilを返すので、hoge=nilとする代わりにhoge=pと短縮できます。
true, false
ご存知だと思いますが、Rubyでは、1, 0がtrue, falseを表しません。trueはTrueClass, falseはFalseClassのオブジェクトです。このため、trueを表したいときは!p, falseを短く表したいときは!0とします。
a.*b+c
a*(b+c)はこのように書くことで括弧を省略でき、1byte短くなります。
array.uniq
array.uniqはarray|[]と書くことができます。
組み込みメソッド
組み込みメソッドは書くとキリがないのでよく使うものだけ幾つか紹介します。詳しく知りたい人は公式のを読んで下さい。
s.chars
文字列sを一文字ずつ分解するときはs.charsが便利です。
i.to_s(n)
整数iをn進数表記した文字列にします。
さいごに
多分まだまだあると思うんですが、もう十分でしょという気分になりました。