Ruby

古いRubyを使う時に気をつけること

常に最新の ruby が使えればそれが一番だけど、実際はそうもいきません。
仕事で、ちょっと古いバージョンの ruby を使うことはしょっちゅうあります。
そして厄介なことに、今の ruby では大丈夫なコードでも、古い ruby だと問題が発生する場合があるんですよね。
パッと思いついたものを忘備録としてメモしました。他にもあったら教えてください。

ruby 2.4以前

Objectクラスの定数を、そのサブクラスから参照できてしまう

CONST = 1

class A
end

class B
end

A::CONST
#=> 例外にならず、1が返される

A::B
#=> 例外にならず、Bクラスが返される
# Rails で「`a/b.rb` を読み込んでほしいのに何故かトップレベルのクラスを参照しちゃう!」
# というバグを生む原因となる。

ruby 2.4以前で、Objectクラスの定数をそのサブクラスからガッツリ参照できてしまう問題です。
A.superclass #=> Object とか考えると、確かに↑の動作は正しいんですが、やっぱり直感的ではないですよね。
Railsのオートロードを過信していると「const missing の発生を期待しているのにトップレベルの定数を参照しちゃう」という事故が起きます。

ruby2.5 からは、上記のような参照を行わなくなりました。

ruby 2.1以前

ユーザの入力に対して、 #to_sym を使ってはいけない。

(ヤバい例)

if params[:aaa].to_sym == :xyz  # ここの to_sym がヤバい
  # ...処理...
end

ruby2.1 以前は、「一度作ったSymbolを絶対に忘れない」という仕組みになっています。ユーザの入力(paramsなど)に対して to_sym してしまうと、メモリリークを引き起こす可能性があり、とても危険です。

ruby2.2 からは Symbol GC という機能が導入され、気を遣う必要がなくなったので、いくらでも to_sym してください。