まえがき
あまり一般的な書き方ではない(かもしれない)けどオシャレなRubyの書き方集です。
場合によっては有用ですが、濫用すると可読性を損なうのでチーム開発等他の人が読む場面では避けたほうがよさそうです。
「そんなの関係ないから俺は俺のオレオレコードを書く」っていう厨二病の人のためのスニペット。
変数代入時のArray#firstをやめる
array = [3, 2, 1]
elm = array.first
p elm # => 3
elm, = array
p elm # => 3
二つ目以降の要素は捨てられる。
elm, _, _ = 3, 2, 1
と同じ
Proc#callをやめる
hoge = ->(str) { str.upcase }
hoge.call('fuga') # => "FUGA"
hoge.('fuga') # => "FUGA"
hoge.yield('fuga') # => "FUGA"
hoge['fuga'] # => "FUGA"
hoge === 'fuga' # => "FUGA"
.call
や .()
はよく使われるけど、
hoge['fuga']
や hoge === 'fuga'
でprocを呼ぶのは知らないと誤解をうめる。
String#to_symをしない
文字列リテラルの前に :
(コロン)でシンボルになる
'hoge'.to_sym # => :hoge
:'hoge' # => :hoge
もちろん変数展開もできる
fuga = 'fuga'
:"hoge_#{fuga}" #=> :hoge_fuga
Array#joinをしない
Array#*
で代替できる
['a', 'b', 'c'].join('/') # => "a/b/c"
['a', 'b', 'c']*'/' # => "a/b/c"
真偽値をひっくり返すには前置の!ではなくBasicObject#!で
!true # => false
true.! # => false
前置の!と同様にnilかfalseじゃなければfalseが返る
''.! # => false
''.!.!.! # => false
Range#to_aをやめる
配列式の中でrangeを展開する
(1..5).to_a # => [1, 2, 3, 4, 5]
[*(1..5)] # => [1, 2, 3, 4, 5]
String#uptoを使う
○回ループしたい場合に、安易に
3.times { p 'hello' }
# => "hello"
# => "hello"
# => "hello"
とか
1.upto(3) { p 'hello' }
# => "hello"
# => "hello"
# => "hello"
せずに、 String#upto
を使う
'a'.upto('c') { p 'hello' }
# => "hello"
# => "hello"
# => "hello"
もちろん値もとれる
'a'.upto('c') { |char| p char }
# => "a"
# => "b"
# => "c"
#upto
がStringクラスでも使えるのはあまり知られていないかも。
ループごとにレシーバの文字列から String#succ
が呼ばれる。
100回まわしたいときは 'a'.upto('cv')
。
文字列中の変数展開を使わない
String#<< を使う。
text = 'hoge'
html = "<span>#{text}</span>" # => "<span>hoge</span>"
↑辟易する↓シブい
text = 'hoge'
html = '<span>'<<text<<'</span>' # => "<span>hoge</span>"
無事読みにくくなった
コード全体をヒアドキュメントにしてevalで実行する
eval(<<-EOS)
p 'hoge'.upcase
p 'FUGA'.downcase
EOS
# => "HOGE"
# => "fuga"
意味はない
おわり
みなさんの厨二病スニペットおしえてください