LoginSignup
5
3

More than 3 years have passed since last update.

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

Last updated at Posted at 2018-03-11

常に最新の 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 してください。

5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3