class local instance variable
yuyaさんにクラスローカルインスタンス変数を教えてもらったは良いけれど、ネットで調べてみてもいろんな記述があって訳ワカメ。どうかくのが正しいのか良くわかんない。Smalltalkだとまんま ... class instanceVariableNames: '...' があるのだけれど・・・
とりあえず rubyで調べてみると、、、
- class << self; でクラスインスタンスの特異メソッドとして accessorを定義する
- @_hogehoge みたいに_を先頭につける
とか見つけたんだけど2つ目の奴は普通にcRuby 1.9.1だとなんかうまくいかない。これってsnapshot版とかで動かすのかな?よくわかんない。
とりあえず1で試してみた。
class Computer class << self; attr_accessor :machines, end attr_accessor :name @machines = [] @@total_machines = [] def self.total_machines @@total_machines end def register @@total_machines << self self.class.machines << self end def initialize name @name = name end end class DesktopPC < Computer @machines = [] end class NotePC < Computer @machines = [] end class Macintosh < Computer @machines = [] end DesktopPC.new('DIY-1gou').register DesktopPC.new('DIY-2gou').register NotePC.new('Lavie').register NotePC.new('VAIO-P').register NotePC.new("Let's Note").register Macintosh.new('Mac SE').register Macintosh.new('iMac').register Macintosh.new('MacBook').register Macintosh.new('PowerMac').register def p(ary) puts "#{ary.map(&:name)} #{ary.size}" end p Computer.total_machines p DesktopPC.machines p NotePC.machines p Macintosh.machines
quartz% ruby classinstance.rb ["DIY-1gou", "DIY-2gou", "Lavie", "VAIO-P", "Let's Note", "Mac SE", "iMac", "MacBook", "PowerMac"] 9 ["DIY-1gou", "DIY-2gou"] 2 ["Lavie", "VAIO-P", "Let's Note"] 3 ["Mac SE", "iMac", "MacBook", "PowerMac"] 4
pythonでもやってみた。こっちは泥臭い。もっときれいに書く方法がきっとあると思うのでもう少し調べる。
class Computer(object): _total_machines = [] @classmethod def machines(cls): return cls._machines @classmethod def total_machines(cls): return cls._total_machines def register(self): Computer._total_machines.append(self) try: type(self)._machines.append(self) except: type(self)._machines = [self] def __init__(self, name): self.name = name class DesktopPC(Computer): pass class NotePC(Computer): pass class Macintosh(Computer): pass DesktopPC('DIY-1gou').register() DesktopPC('DIY-2gou').register() NotePC('Lavie').register() NotePC('VAIO-P').register() NotePC("Let's Note").register() Macintosh('Mac SE').register() Macintosh('iMac').register() Macintosh('MacBook').register() Macintosh('PowerMac').register() def p(ary): print [item.name for item in ary], len(ary) p(Computer.total_machines()) p(DesktopPC.machines()) p(NotePC.machines()) p(Macintosh.machines())
quartz% python classinstance.py ['DIY-1gou', 'DIY-2gou', 'Lavie', 'VAIO-P', "Let's Note", 'Mac SE', 'iMac', 'MacBook', 'PowerMac'] 9 ['DIY-1gou', 'DIY-2gou'] 2 ['Lavie', 'VAIO-P', "Let's Note"] 3 ['Mac SE', 'iMac', 'MacBook', 'PowerMac'] 4
なんか実は良くわかってない。が、目的は達成しているような気はする。