Tech Racho エンジニアの「?」を「!」に。
  • 開発

[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にもバックポートされています。

関連記事


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。