76

selfメソッド定義に追加することの意味を誰かが私に説明できますか?thisJavaのキーワードに 似ていますか?

4

3 に答える 3

101

他の言語とは異なり、Rubyにはクラスメソッドはありませんが、特定のオブジェクトにアタッチされたシングルトンメソッドがあります。

cat = String.new("cat")
def cat.speak
    'miaow'
end
cat.speak #=> "miaow" 
cat.singleton_methods #=> ["speak"] 

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

Class(*)のインスタンスを作成します。クラス定義内で、Rubyは定数Aに割り当てられたClassのこの新しいインスタンスにselfを設定します。したがって、def self.c_methodと同等です。def cat.speakつまり、現在クラスAであるオブジェクトselfにアタッチされたシングルトンメソッドを定義します。 。

現在、クラスAには2つのシングルトンメソッドがあり、これらは一般にクラスメソッドと呼ばれます。

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

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

于 2012-12-04T18:53:55.113 に答える
60

rubyの自己はthis、Javaの場合と多少似ていますが、クラスに関してはstatic、Javaのキーワードに似ています。簡単な例:

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

更新: Javaの静的メソッドとrubyのクラスメソッドの違い

Javaの静的メソッドには、インスタンスメソッドとは異なる2つの異なる機能があります。a)静的メソッド、b)インスタンスに関連付けられていないメソッドです。(IOW:実際にはメソッドとはまったく異なり、単なるプロシージャです。)Rubyでは、すべてのメソッドが動的であり、すべてのメソッドがインスタンスに関連付けられています。実際、3種類の「メソッド」(インスタンスメソッド、静的メソッド、コンストラクター)があるJavaとは異なり、Rubyにはインスタンスメソッドという1種類のメソッドしかありません。つまり、いいえ:Javaの静的メソッドはRubyのメソッドとはまったく異なります。–JörgWMittag1時間前

于 2012-12-04T15:40:51.707 に答える
13

メソッドを宣言する場合self、宣言のはクラス/モジュールの宣言であるため、事実上、クラスメソッドを定義しています。staticクライアントの場合、これはJavaのメソッドと同様に機能します。クライアントは、インスタンスではなくクラスのメソッドを呼び出します。MyClass.method

ここでは、クラスメソッドとインスタンスメソッドの詳細を確認できます。

編集:キーワードはJavaselfのキーワードに似ていますが、クラスメソッド宣言に使用する効果は、Javaのキーワードを使用する効果と似ています。類似点は、rubyのクラスメソッドのようなjavaの静的メソッドは、クラスのインスタンスの代わりにクラスオブジェクトiselfを使用してアクセスされることです。thisselfstatic

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

于 2012-12-04T15:35:45.530 に答える