Movatterモバイル変換


[0]ホーム

URL:


rochefort's blog

この広告は、90日以上更新していないブログに表示しています。

クラス変数("@@")やめとけってよ

クラス変数("@@")使う人あんまりいないと思うけど、グローバル変数と同じようなもんだから使うなよっていう話。

Effective Ruby

Effective Ruby

項目15 クラス変数よりもクラスインスタンス変数を使うようにしよう

クラス変数を使ってSingletonを実装してみる

一見いい感じ。

classSingletonprivate_class_method(:new,:dup,:clone)defself.instance@@single ||= newendend

でもサブクラスだとNG

全てのサブクラス間で共有されてしまう。

classConfiguration <Singleton;endclassDatabase <Singleton;end>>Configuration.instance#<Configuration:0x00007fed1a890c88># NG: Configurationになっちゃう>>Database.instance#<Configuration:0x00007fed1a890c88>

解決方法:クラスインスタンス変数

「クラスメソッド内でインスタンス変数?」となるかもしれないが、クラスもオブジェクト。

classSingletonprivate_class_method(:new,:dup,:clone)defself.instance# @@ -> @に変更するだけ@single ||= newendend

おまけ

スレッドを考慮すると上記実装では不十分。標準ライブラリのSingletonを使うと良い。

require"singleton"classConfigurationincludeSingletonend

覚えておくべき事項

  • クラス変数よりもインスタンス変数を使うようにしよう。
  • クラスはオブジェクトなので、専用のプライベートなインスタンス変数セットを持っている。
About
id:rochefortid:rochefort

Ruby・Rails・Mac・Web・Tech、時々日々のことについて書いています。

follow
Search
Top Entries
はてなブックマーク数
Categories
Comments

    引用をストックしました

    引用するにはまずログインしてください

    引用をストックできませんでした。再度お試しください

    限定公開記事のため引用できません。

    読者です読者をやめる読者になる読者になる

    [8]ページ先頭

    ©2009-2025 Movatter.jp