[Rails 5.1]thread_mattr_accessorの変数はサブクラスと共有されないようになった(翻訳)

こんにちは、hachi8833です。BigBinaryシリーズは、Rails 5.1記事と、それに関連するRails 5時代の記事をお送りいたします。

[Rails5]モジュールやクラスレベルの変数をスレッドベースで作成する機能(翻訳)

概要

以下の環境で確認しました。

  • Rails 5.1.1 + Ruby 2.4.1
  • Rails 5.0.2 + Ruby 2.4.1
  • Rails 5.0.0 + Ruby 2.3.3

thread_mattr_accessorの変数はサブクラスと共有されないようになった(翻訳)

Rails 5.0から、クラス変数をスレッドベースで定義するmattr_accessorが提供されています。

しかし、定義した変数は子クラスとも共有されるという問題がありました。つまり、子クラスで変数を変更すると以下のように親クラスの変数も変更されてしまいます。

class Player
  thread_mattr_accessor :alias
end

class PowerPlayer < Player
end

Player.alias = 'Gunner'
PowerPlayer.alias = 'Bomber'

PowerPlayer.alias 
# "Bomber"

Player.alias 
# "Bomber"

これはオブジェクト指向的に望ましい動作ではありません。

この問題はRails 5.1で修正されましたthread_mattr_accessorの値を子クラスで変更しても親クラスの値には影響しません。

class Player
  thread_mattr_accessor :alias
end

class PowerPlayer < Player
end

Player.alias = 'Gunner'
PowerPlayer.alias = 'Bomber'

PowerPlayer.alias 
# "Bomber"

Player.alias 
# "Gunner"

訳注: この修正は5.0-stableにもバックポートされています。

関連記事

Ruby on RailsによるWEBシステム開発、Android/iPhoneアプリ開発、電子書籍配信のことならお任せください この記事を書いた人と働こう! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

hachi8833

Twitter: @hachi8833、GitHub: @hachi8833

コボラー、ITコンサル、ローカライズ業界、Rails開発を経てTechRachoの編集・記事作成を担当。
これまでにRuby on Rails チュートリアル第2版の半分ほど、Railsガイドの初期翻訳ではほぼすべてを翻訳。その後も折に触れてそれぞれ一部を翻訳。
かと思うと、正規表現の粋を尽くした日本語エラーチェックサービス enno.jpを運営。
実は最近Go言語が好き。
仕事に関係ないすっとこブログ「あけてくれ」は2000年頃から多少の中断をはさんで継続、現在はnote.muに移転。

hachi8833の書いた記事

BPSアドベントカレンダー

週刊Railsウォッチ

インフラ

BigBinary記事より

ActiveSupport探訪シリーズ