Hatena::Groupsubtech

冬通りに消え行く制服ガールは✖夢物語にリアルを求めない。

 | 

Oct 05, 2007 (Fri)

ruby, クラスインスタンス変数と、クラス変数 01:56 はてなブックマーク - ruby, クラスのインスタンス変数と、クラス変数 - 冬通りに消え行く制服ガールは✖夢物語にリアルを求めない。

なにがちがうんだって思ったらリファレンスマニュアルに書いてあった……

http://www.ruby-lang.org/ja/man/index.cgi?cmd=view;name=%CA%D1%BF%F4%A4%C8%C4%EA%BF%F4

サブクラスからの参照/代入が大きな違いかな。クラスインスタンス変数はあくまでそのクラスにしか属さないから、サブクラスからは頑張って superclass 探すしかアクセスする術がない。

無駄だけど以下のようにすればだいたいクラス変数と同じことがクラスインスタンス変数でできる。

class Hoge
	@@test = :CV_test
	@test = :IV_test

	def hoge
		[
			@@test,
			self.class.ancestors.find {|c|
				c.instance_variables.include?("@test")
			}.instance_variable_get(:@test)
		]
	end

end

p Hoge.new.hoge #=> [:CV_test, :IV_test]
p Hoge.new.hoge #=> [:CV_test, :IV_test]

class Fuga < Hoge
end

p Fuga.new.hoge #=> [:CV_test, :IV_test]
p Fuga.new.hoge #=> [:CV_test, :IV_test]

サブクラスからはアクセスされたくない場合だけクラスインスタンス変数をつかうべきかな (具体的にはどういうケースだろう)

 | 

スポンサード リンク

書いてる人

cho45 (佐藤広央) (www.lowreal.net)

Perl, JavaScript, Ruby, HTML, CSS, Web etc


スポンサード リンク