[#21736] OBJECTDAY 2000 — 助田 雅紀 <masaki.suketa@...>

助田です.

29 messages 2000/04/03
[#21748] Re: OBJECTDAY 2000 — keiju@... (石塚圭樹) 2000/04/04

けいじゅ@日本ラショナルソフトウェアです.

[#21753] Re: OBJECTDAY 2000 — Hideto ISHIBASHI <hideto-i@...4u.or.jp> 2000/04/05

石橋秀仁です。

[#21755] Re: OBJECTDAY 2000 — keiju@... (石塚圭樹) 2000/04/05

けいじゅ@日本ラショナルソフトウェアです.

[#21837] site_ruby & Linux distribution — OZAWA Sakuro <crouton@...>

小澤さくです。

14 messages 2000/04/10

[#21922] ruby-1.4.4 binary for BeOS 5 (Intel) — tenmei@... (Noriaki Harada)

はらだです。

23 messages 2000/04/15
[#21923] Re: ruby-1.4.4 binary for BeOS 5 (Intel) — NAITOH Jun <naitoh@...> 2000/04/15

はじめまして、内藤と申します。

[#21926] Re: ruby-1.4.4 binary for BeOS 5 (Intel) — tenmei@... (Noriaki Harada) 2000/04/16

>はじめまして、内藤と申します。

[#21930] Re: ruby-1.4.4 binary for BeOS 5 (Intel) — NAITOH Jun <naitoh@...> 2000/04/16

内藤です。

[#21968] Re: ruby-1.4.4 binary for BeOS 5 (Intel) — Katsuyuki Komatsu <komatsu@...> 2000/04/17

小松です。

[#21969] Re: ruby-1.4.4 binary for BeOS 5 (Intel) — NAITOH Jun <naitoh@...> 2000/04/17

再び内藤です。

[#21956] Thread & STDIN — Masato Toyoshima <mt@...>

はじめまして、豊島といいます。

16 messages 2000/04/17

[#21981] rd2man — WATANABE Hirofumi <eban@...>

わたなべです.

29 messages 2000/04/18
[#21982] Re: rd2man — Toshiro Kuwabara <toshirok@...3.so-net.ne.jp> 2000/04/18

Toshです。

[#21985] Re: rd2man — WATANABE Hirofumi <Hirofumi.Watanabe@...> 2000/04/19

わたなべです.

[#22036] Re: rd2man — Wakou Aoyama <wakou@...> 2000/04/20

青山です。

[#22040] Re: rd2man — Toshiro Kuwabara <toshirok@...3.so-net.ne.jp> 2000/04/21

Toshです。

[#22014] shell interactive — WATANABE Daisaku <dwata@...3.rim.or.jp>

31 messages 2000/04/20
[#22016] Re: shell interactive — 時田幸粋 <ktokita@...> 2000/04/20

こんにちは、時田です。

[#22017] Re: shell interactive — nobu.nakada@... 2000/04/20

なかだです。

[#22018] Re: shell interactive — WATANABE Hirofumi <Hirofumi.Watanabe@...> 2000/04/20

わたなべです.

[#22027] Re: shell interactive — 時田幸粋 <ktokita@...> 2000/04/20

こんにちは、時田です。

[#22103] Please put ruby-1.4.4.tar.gz in pub/lang/ruby/1.4/ — "Akinori -Aki- MUSHA" <knu@...>

 お願いがあるのですが、 ruby-1.4.4.tar.gz を FTP ツリーの 1.4/

16 messages 2000/04/25
[#22199] Where to put ruby-i.j.k.tar.gz on? (Re: ) — SUGIHARA Hiroshi <maili31s@...> 2000/04/28

[ruby-list:22103]におきまして、2000/04/25 12:38ほどに、

[#22117] StateGraph: state machine interpreter — Hideto ISHIBASHI <hideto-i@...4u.or.jp>

石橋 "rubyholic" 秀仁です。

16 messages 2000/04/25

[#22159] $LOAD_PATH への追加について — "Sugawara Hajime" <sugawara@...>

 はじめまして、菅原@ホビー・データです。

13 messages 2000/04/27

[#22181] Can't Use optparse — Yamada Kenji <kyamada@...>

28 messages 2000/04/28
[#22186] Re: Can't Use optparse — akira yamada / やまだあきら <akira@...> 2000/04/28

[#22195] Re: Can't Use optparse — Toshiro Kuwabara <toshirok@...3.so-net.ne.jp> 2000/04/28

Toshです。

[#22261] Re: Can't Use optparse — nobu.nakada@... 2000/05/04

なかだです。

[#22264] Re: Can't Use optparse — Toshiro Kuwabara <toshirok@...3.so-net.ne.jp> 2000/05/04

Toshです。

[#22270] Re: Can't Use optparse — nobu.nakada@... 2000/05/04

なかだです。

[#22272] Re: Can't Use optparse — Toshiro Kuwabara <toshirok@...3.so-net.ne.jp> 2000/05/04

Toshです。

[#22300] Re: Can't Use optparse — Koji Arai <JCA02266@...> 2000/05/05

新井です。

[ruby-list:22134] クラス変数モジュール (Re: デフォルト付き attr_reader)

From: tnaka@...
Date: 2000-04-26 02:03:37 UTC
List: ruby-list #22134
中島@ブレーンです。

やっぱりあったのですね!ずっとかっこいい解が・・・rubyなら、な
んかあるだろうと思っていましたが、予想以上に短くてシンプルで驚
きました。

そこで、復習の意味もかねてこれを応用してクラス変数のモジュール
を作ってみました。

  def_class_var :cv1, 0

というふうにクラス変数を定義できるようになります(2つめのパラメー
タは既定値)。そして、代入は

    set_cv(:cv1, cv1+1)

です。参照は単純に変数名で参照できます。

-------------------------------------------------------------
# includeするとクラス変数が使えるようになるモジュール
module ClassVar
  def ClassVar::append_features(klass)
    super
    def klass::def_class_var(var_name, initial_value=nil)
      var_name = var_name.id2name unless var_name.kind_of?(String)
      module_eval <<-END
        Class_var_#{var_name} = []
        Class_var_#{var_name}[0] = initial_value if initial_value
        def #{var_name}
	  Class_var_#{var_name}[0]
	end
	def #{var_name}=(val)
	  Class_var_#{var_name}[0] = val
	end
      END
    end
  end
  def set_cv(var_name, value)
    var_name = var_name.id2name unless var_name.kind_of?(String)
    instance_eval "Class_var_#{var_name}[0] = value"
  end
end

# 使用例

class B1
  include ClassVar

  # クラス変数定義
  def_class_var :cv1, 0
  def_class_var :cv2, "cv2 defalut"

  def initialize(name)
    @name = name
  end

  def increment_cv
    # 参照と代入
    set_cv(:cv1, cv1+1)
    # self.cv1 = cv1 + 1
  end

  def method1
    print "method1 was called for #{@name}\n"
    increment_cv
    if cv1 > 1
      set_cv(:cv2, "cv2 changed by #{@name}")
      #self.cv2 = "cv2 changed by #{@name}"
    end
  end

  def show
    print "cv1 (in #{@name}) = #{cv1}\n"
    print "cv2 (in #{@name}) = #{cv2}\n"
  end
end


b11 = B1.new("B1_1")
b12 = B1.new("B1_2")

b11.show
b12.show
b11.method1
b11.show
b12.show
b12.method1
b11.show
b12.show
-------------------------------------------------------------
実行結果は次のとおりです。
-------------------------------------------------------------
[tnaka@ryoma tmp]$ ruby test3.rb
cv1 (in B1_1) = 0
cv2 (in B1_1) = cv2 defalut
cv1 (in B1_2) = 0
cv2 (in B1_2) = cv2 defalut
method1 was called for B1_1
cv1 (in B1_1) = 1
cv2 (in B1_1) = cv2 defalut
cv1 (in B1_2) = 1
cv2 (in B1_2) = cv2 defalut
method1 was called for B1_2
cv1 (in B1_1) = 2
cv2 (in B1_1) = cv2 changed by B1_2
cv1 (in B1_2) = 2
cv2 (in B1_2) = cv2 changed by B1_2
-------------------------------------------------------------

代入は set_cvだけでなく、変数名=というメソッドも定義したのです
が、これを呼びだすには、

self.cv1 = .....

という書き方が必要になるようなので、set_cvというメソッドを別に
定義しています。

「変数名で変数の種別がわかる」というrubyの特色が一部失われます
が、それに目をつぶれば、多少は使えるような気がします。

それから、このクラス変数はサブクラスで再定義できます。上のコー
ドに下記のコードをつなげてみると
-------------------------------------------------------------
class B2 < B1
  def_class_var :cv2, "redefined default"
end

b21 = B2.new("B2_1")
b11.show
b21.show
b21.method1
b11.show
b21.show
-------------------------------------------------------------
実行結果は
-------------------------------------------------------------
cv1 (in B1_1) = 2
cv2 (in B1_1) = cv2 changed by B1_2
cv1 (in B2_1) = 2
cv2 (in B2_1) = redefined default
method1 was called for B2_1
cv1 (in B1_1) = 3
cv2 (in B1_1) = cv2 changed by B1_2
cv1 (in B2_1) = 3
cv2 (in B2_1) = cv2 changed by B2_1
-------------------------------------------------------------

cv1は再定義されてないので、上位クラスと共有します。cv2は再定義
したので、class B2独自のクラス変数になります。B1(上位クラス)の
メソッド内で、

      set_cv(:cv2, "cv2 changed by #{@name}")

とやると、B2(下位クラス)の方のcv2が変更されます。つまり、C++な
どと違って、クラス変数も動的結合になります。

# 長年C++を使ってきたので、こういう動的オブジェクト指向がおも
# しろくてハマッてます。10年以上前にsmalltalkの青本を読んで
# 「こういう言語で遊びたい」と思ったのですが、やっと夢がかなっ
# た感じです。まつもとさんには感謝してます。

-------------------------------------------------------------
中島 拓 (株)ブレーン パッケージ開発部 
(p95@brain-tokyo.co.jp)
http://www03.u-page.so-net.ne.jp/dc4/tnaka/

In This Thread