2008-01-31 (木) [長年日記]
■ [Ruby] Writing Effective Ruby Code - Patterns(2)
よくある条件を上にする
- if や case では、よくある条件を上にする。
グローバル定数のアクセス最適化
- 定数の参照はアクセスするたびに解決される(動的に変更される可能性があるから)
- 定数は身近なスコープから解決していくので、 :: を明示的につけて呼び出すと安い
インスタンス変数にデータをキャッシュ
- 何度も使うならインスタンス変数にする
クラス変数にデータをキャッシュ
- ある程度のサイズだったらクラス変数にしてもいい
変数のキャッシュを効率的に
- ||=
変数はnilで初期化されるよ
- だよ
.nil?を使う
- if x.nil? とかメソッド呼び出しするなら unless x でいい
nil? または empty? vs blank?
- ActionPackが追加したblank?
- x.blank? == (x.nil? || x.empty?)
まーでも、x.to_s == "" とかしちゃうよ(kdmsnr)
returnを使う
- メソッドの最後の式を勝手にreturnしてくれる。
- 1.8だとreturnつけるよりも速いけど、1.9だと直ってるよ。
returningの使用
- ActiveSupportには returning メソッドがある
class Object
def returning(value)
yield(value)
value
end
:
- 何かの値とブロックを渡して評価して返ってこさせる
any?を使う
- any?遅いよany?
- 1.9だとString.any?はなくなってる
ブロックの引数
- ブロックローカルとメソッドローカルの速さは1.8と1.9で逆転してる
平行代入
irb(main):001:0> a, b = 1, 2 => [1, 2]
- なので、パフォーマンスが問題となるところではあまり使わないほうがいいかも
[ツッコミを入れる]
