[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 コボラー、ITコンサル、ローカライズ業界を経てなぜかWeb開発者志願。 これまでにRuby on Rails チュートリアルの大半、Railsガイドのほぼすべてを翻訳。 かと思うと、正規表現の粋を尽くした日本語エラーチェックサービス enno.jpを運営。 仕事に関係ないすっとこブログ「あけてくれ」は2000年頃から多少の中断をはさんで継続、現在はnote.muに移転。

hachi8833の書いた記事

週刊Railsウォッチ

インフラ

BigBinary記事より

ActiveSupport探訪シリーズ