[#31191] クラスメソッドについて — cyross@...

みなさん、初めまして。

16 messages 2001/09/02
[#31192] Re: クラスメソッドについて — matz@... (Yukihiro Matsumoto) 2001/09/02

まつもと ゆきひろです

[#31196] ありがとうございます( Re: Re: クラスメソッドについて) — cyross@... 2001/09/03

サイロスです。

[#31234] oracle: sub query — Yasushi Shoji <yashi@...>

やすしです。

16 messages 2001/09/04
[#31241] Re: oracle: sub query — Yasushi Shoji <yashi@...> 2001/09/05

At Tue, 4 Sep 2001 19:59:11 +0900,

[#31238] 半角から全角へ変換 — 吉川 正晃 <yosikawa@...>

吉川と申します。こちらには初めての投稿になります。

33 messages 2001/09/05
[#31240] Re: 半角から全角へ変換 — WATANABE Hirofumi <eban@...> 2001/09/05

わたなべです。

[#31244] jcode + String#tr は? — Take_tk <ggb03124@...> 2001/09/05

たけ(tk)です。

[#31245] Re: jcode + String#tr は? — WATANABE Hirofumi <eban@...> 2001/09/05

わたなべです。

[#31280] 掲示板の再読み込み時の問題 — みかみまさと <kofu@...>

こんにちは。いつもお世話になっています、みかみと申します。

13 messages 2001/09/06

[#31283] ruby 1.6.5 preview1 — matz@... (Yukihiro Matsumoto)

まつもと ゆきひろです

17 messages 2001/09/06

[#31377] 添付ライブラリのリファレンス (HTML) — "Sadayuki Sakamoto" <flea@...8.dion.ne.jp>

酒本と申します。

20 messages 2001/09/11

[#31414] ruby 1.6.5 preview — m_seki@...

18 messages 2001/09/14

[#31419] Hash#+ ハッシュの足し算はいかが? — Take_tk <ggb03124@...>

class Hash

12 messages 2001/09/14

[#31508] 全角を半角に変換 — yoshikazu tsubaki <y-tsubaki@...>

#2回目の人ごめんなさい(間違えて2つのMLに送信してしまいました)

14 messages 2001/09/17

[#31626] my LC2001 summary — Minero Aoki <aamine@...>

あおき@結局三日連続で飲んでしまった です。

117 messages 2001/09/28
[#31642] Re: my LC2001 summary — Masaki Suketa <masaki.suketa@...> 2001/09/29

助田です。

[#31663] Re: my LC2001 summary — nobu.nakada@... 2001/09/30

なかだです。

[#31665] Re: my LC2001 summary — TAKAHASHI Masayoshi <maki@...> 2001/09/30

高橋征義です。

[#31672] Re: my LC2001 summary — matz@... (Yukihiro Matsumoto) 2001/10/01

まつもと ゆきひろです

[#31697] RUG (Re: my LC2001 summary) — TAKAHASHI Masayoshi <maki@...> 2001/10/02

高橋征義です。

[#31699] URUG (Re: RUG) — Kazuhiro Yoshida <moriq.kazuhiro@...> 2001/10/02

もりきゅうです。

[#31688] bcc (Re: my LC2001 summary) — Kazuhiro Yoshida <moriq.kazuhiro@...> 2001/10/01

もりきゅうです。

[#31692] Re: bcc (Re: my LC2001 summary) — "U.Nakamura" <usa@...> 2001/10/01

こんにちは、なかむら(う)です。

[#31779] Re: bcc (Re: my LC2001 summary) — Kazuhiro Yoshida <moriq.kazuhiro@...> 2001/10/05

もりきゅうです。

[#31782] Re: bcc (Re: my LC2001 summary) — "T.Kitahara" <tko-k@...> 2001/10/05

はじめまして、Kita といいます。

[#31785] Re: bcc (Re: my LC2001 summary) — Kazuhiro Yoshida <moriq.kazuhiro@...> 2001/10/06

もりきゅうです。

[#31805] Re: bcc (Re: my LC2001 summary) — nobu.nakada@... 2001/10/09

なかだです。

[#31806] Re: bcc (Re: my LC2001 summary) — "U.Nakamura" <usa@...> 2001/10/09

こんにちは、なかむら(う)です。

[#31808] Re: bcc (Re: my LC2001 summary) — nobu.nakada@... 2001/10/09

なかだです。

[#31809] Re: bcc (Re: my LC2001 summary) — "U.Nakamura" <usa@...> 2001/10/09

こんにちは、なかむら(う)です。

[#31814] Re: bcc (Re: my LC2001 summary) — Kazuhiro Yoshida <moriq.kazuhiro@...> 2001/10/09

もりきゅうです。

[ruby-list:31193] Re: クラスメソッドについて

From: MOROHOSHI Akihiko <moro@...>
Date: 2001-09-02 16:41:32 UTC
List: ruby-list #31193
師星と申します。

> 今回知りたいのは「クラスメソッドの概念」についてです。
> 
> この間、「プログラミングRuby」を購入して勉強していますが(ちなみに、Ruby
> の本は「RubyでCGI」以外は全て持っています)、クラスメソッドに対しては、
> だいぶ理解に悩んでいます。

いったんクラスメソッドを忘れてお読みはじめ下さい。


1. Rubyのメソッドは、次の2種類に分けられます。
 - インスタンスメソッド
 - 特異メソッド

1.1. インスタンスメソッドは、そのクラスのインスタンスはどれでも使えま
     す。これに関しては特に理解に問題はないかと思います。

	例:
	class A
	  def a
	    print "a"
	  end
	end
	
	a1 = A.new
	a2 = A.new
	a1.a	# => "a"
	a2.a	# => "a"

1.2. 特異メソッドは、ある特定のオブジェクトだけが使えるメソッドです。
     これを定義するには、通常、"def クラス名.メソッド名" という書式を
     使います(*1)。

	例:
	a3 = A.new
	def a3.aa
	    print "aa"
	end
	a3.aa	# => "aa"
	a1.aa	# => エラー

     この特異メソッドの概念は、C++やJavaにはないものです。

2. Rubyでは、クラスも一つのオブジェクトです。
   クラスを定義するということは、クラスオブジェクトを一つ生成するとい
   うことでもあります。クラスAを定義すると、Aというクラスオブジェクト
   が作られるわけです。
   クラスメソッドは、このクラスオブジェクトが持つ特異メソッドです(*2)。

	例: (1.2の例と見比べてみてください)
	def A.aaa
	    print "aaa"
	end
	A.aaa	# => "aaa"

   クラスメソッドを使えるのはクラスオブジェクトAという特定のオブジェク
   トだけですから、そのクラスのインスタンスa1、a2、a3では使えません。

	例:
	a1.aaa	# => エラー

2.1. 但し、クラスオブジェクトは、特異メソッドに関して通常のオブジェク
     トとは少し異なった特殊な振る舞いをします。

2.1.1. クラスオブジェクトは、上位クラスの特異メソッドを受け継ぎます。
       これは「ある特定のインスタンスだけが使える」という特異メソッド
       の性質に対する例外です(*3)。

	例:
	class B < A
	end
	
	B.aaa	# => "aaa"

2.1.2. (ほかにありましたっけ?)

2.2. いってみれば、Rubyでは、クラスオブジェクトの特異メソッドを、
     2.1節のような特殊な取り扱いをすることで、C++やJavaのクラスメソッド
     を「模倣」しているのだ、といえます。
     ですから、Rubyの世界をストレートに理解するためには、クラスメソッド
     という概念をことさらに意識する必要はないと思います。


以上をふまえると、ご質問にある文章は次のように言い換えられるでしょうか。

> 1.クラスメソッドというものは、「オブジェクトを生成しなくても使用できる
> メソッド」ということでしょうか?

  「オブジェクト         を生成しなくても使用できるメソッド」
→「クラスAのインスタンスを生成しなくても使用できるメソッド」

> 2.クラスメソッドは、「クラスに属するメソッド」という説明と「特定のオブ
> ジェクトに関連づけられないメソッド」という二つがありますが、この二つの関
> 係がよくわからないのですが・・・。
> # いくつか解説書を読むと、「どこかでメソッド定義を行うと、そのクラス内
> で定義しなくても使用することができるメソッド」と取れるのですが・・・

  「クラス             に属する      メソッド」
→「クラスオブジェクトAが受け手であるメソッド」

  「特定のオブジェクト           に関連づけられない メソッド」
→「クラスAのインスタンス(a1など)が受け手にならない メソッド」

> 3.クラスメソッドは、使用するときに「クラス名.クラスメソッド名」と書く
> のはまだわかるのですが、定義でも「クラス名.クラスメソッド名」と書くのは
> なぜなのでしょうか? ただ単にオブジェクトから使えるメソッドと区別するた
> めでしょうか?(たとえば、オブジェクトがら使えるメソッドと同じ名前でクラ
> スメソッドが使える利点があるとか)

1.2. と 2. を見比べると、それは単に特異メソッドであるから、ということ
がわかりやすいのではないかと思います。

In This Thread