常に最新の ruby が使えればそれが一番だけど、実際はそうもいきません。
仕事で、ちょっと古いバージョンの ruby を使うことはしょっちゅうあります。
そして厄介なことに、今の ruby では大丈夫なコードでも、古い ruby だと問題が発生する場合があるんですよね。
パッと思いついたものを忘備録としてメモしました。他にもあったら教えてください。
ruby 2.6以前
self を付けて private メソッドを呼び出すことができない
class Foo
def test
self.private_foo
end
private
def private_foo
puts 'private!!'
end
end
Foo.new.test
#=> NoMethodError (private method `private_foo' called for #<Foo:0x00007f40a04bced0>)
ruby 2.6以前だと、private メソッドは基本的にレシーバ無しで呼び出す必要がありました。
2.7からは、 self.private_foo
のような呼び出しが可能になりました。
ruby 2.4以前
Objectクラスの定数を、そのサブクラスから参照できてしまう
CONST = 1
class A
end
class B
end
A::CONST
#=> 例外にならず、1が返される
A::B
#=> 例外にならず、Bクラスが返される
ruby 2.4以前で、Objectクラスの定数をそのサブクラスからガッツリ参照できてしまう問題です。
A.superclass #=> Object
なので、確かに↑の動作は正しいんですが、やっぱり直感的ではないですよね。
Rails5 以前では、「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
してください。