2012-12-04 13 views

答えて

48

他の言語とは逆に、Rubyにはクラスメソッドはありませんが、特定のオブジェクトにシングルトンメソッドが付属しています。

def cat.speakは、オブジェクトcatに付加されたシングルトンメソッドを作成しました。

あなたがclass Aを書くとき、それはA = Class.newと同等です:

A = Class.new 
def A.speak 
    "I'm class A" 
end 
A.speak #=> "I'm class A" 
A.singleton_methods #=> ["speak"] 

def A.speakたちは、クラスAのクラスメソッド

それを呼び出すために使用するオブジェクトAに添付シングルトンメソッドを作成しましたあなたが書くとき

class A 
    def self.c_method 
     'in A#c_method' 
    end 
end 

あなたはクラス(*)のインスタンスを作成します。クラス定義の中で、Rubyは、クラスAのこの新しいインスタンスに自己を設定します。これは、定数Aに割り当てられています。def self.c_methodは、def cat.speakに相当します。つまり、オブジェクトselfに付加されたシングルトンメソッドを定義します。

クラスAには2つのシングルトンメソッドがあり、これは通常クラスメソッドを呼び出します。

A.singleton_methods 
=> ["c_method", "speak"] 

(*)技術、Aは既にA = Class.newによって作成されています。この場合、class Aは、既存のクラスを再オープン。そのため、最後に2つのシングルトンメソッドがあります。しかし、それがクラスの最初の定義である通常の場合、Class.newを意味します。

+6

これは正解です。経験豊富なRubyistsは、 "クラスオブジェクトのシングルトンクラスのインスタンスメソッド"を意味するのに "クラスメソッド"という用語を使用することもありますが、そのクラスメソッドのようなものは存在しませんルビー。実際、シングルトンメソッドは単なるオブジェクトのシングルトンクラスで定義される通常のメソッドです)。しかし、OPは明らかに経験豊富なRubyistではありません。それゆえ、彼を混乱させて短くするのは良い考えではありません。いいぞ! –

7

メソッドを宣言するとき、宣言のselfは宣言するクラス/モジュールです。したがって、実質的にクラスメソッドを定義しています。これはjavaのstaticメソッドのようなものです。インスタンスの代わりにクラスのメソッドを呼び出すとします。MyClass.method

Hereクラスとインスタンスのメソッドについては、さらに詳しい情報があります。

EDIT:selfキーワードは、Javaでthisキーワードに類似であるが、クラスメソッド宣言にselfを使用する効果は、Javaでstaticキーワードを使用しての効果と同様です。類似点は、RubyのクラスメソッドのようなJavaの静的メソッドは、クラスのインスタンスの代わりにクラスオブジェクトiselfを使ってアクセスされるという点です。

staticはダイナミックの反対側を表していません。このキーワードの名前の選択は疑わしい(おそらくCから継承されている)ので、その意味をよりよく反映するためにperClassなどと呼ばれていたはずです。技術的な意味はすべてのstaticメンバーがクラスローダーごとに1回だけ存在することです。

+1

「静的」のように*何もありません。特に、これらのメソッドは動的であり、静的ではありません。 –

+3

@JörgWMittag:少なくとも1つの意味でJavaの「静的」に似ています。インスタンスレベルではなくクラスレベルに適用されます。 –

+3

@JörgWMittag - は、明確な類似点(確かに違いがあります)のあるものにとってかなり強い言葉です。私の視点を明確にするためにいくつかの情報を追加しました。 – kostja

29

ルビーの自己では、javaではthisと多少似ていますが、クラスになるとjavaのキーワードstaticによく似ています。短い例:

class A 
    # class method 
    def self.c_method 
    true 
    end 
    # instance method 
    def i_method 
    true 
    end 
end 

A.c_method #=> true 
A.i_method #=> failure 
A.new.i_method #=> true 
A.new.c_method #=> failure 

を更新:A):Javaでルビー

内のJavaクラスのメソッドの静的メソッドの違い

静的メソッドがインスタンスメソッドからそれらが違う二つの異なる特徴を有しますそれらは静的であり、b)インスタンスに関連付けられていない。 Rubyでは、すべてのメソッドは動的であり、すべてのメソッドはインスタンスに関連付けられています。実際、3つの異なる「メソッド」(インスタンスメソッド、静的メソッド、およびコンストラクタ)があるJavaとは異なり、Ruby:インスタンスメソッドには1種類のメソッドしかありません。したがって、いいえ:Javaの静的メソッドは、Rubyのメソッドとはまったく異なります。 - JörgW Mittag 1時間前

+0

'static 'のように*何もありません。特に、これらのメソッドは動的であり、静的ではありません。 –

+0

Rubyで 'self#method'と 'class#method'を定義すると' class JavaClass;のようになります。 public static void method ... 'in Java – krichard

+2

Javaの静的メソッドには、インスタンスメソッドと異なる2つの異なる機能があります。a)静的であり、b)インスタンスに関連付けられていません。 Rubyでは、* all *メソッドは動的で、* all *メソッドはインスタンスに関連付けられています(IOW:実際にはメソッド*に似ていません。実際、3つの異なる種類のメソッド(インスタンスメソッド、静的メソッド、コンストラクタ)があるJavaとは異なり、Rubyのインスタンスメソッドには* 1種類のメソッドしかありません。したがって、いいえ:Javaの静的メソッドは、Rubyのメソッドとはまったく異なります。 –

関連する問題