self
メソッド定義に追加することの意味を誰かが私に説明できますか?this
Javaのキーワードに 似ていますか?
3 に答える
他の言語とは異なり、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.new
をclass A
再度開きます。そのため、最後に2つのシングルトンメソッドがあります。しかし、それがクラスの最初の定義である通常の場合、それはを意味しClass.new
ます。
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時間前
メソッドを宣言する場合self
、宣言のはクラス/モジュールの宣言であるため、事実上、クラスメソッドを定義しています。static
クライアントの場合、これはJavaのメソッドと同様に機能します。クライアントは、インスタンスではなくクラスのメソッドを呼び出します。MyClass.method
ここでは、クラスメソッドとインスタンスメソッドの詳細を確認できます。
編集:キーワードはJavaself
のキーワードに似ていますが、クラスメソッド宣言に使用する効果は、Javaのキーワードを使用する効果と似ています。類似点は、rubyのクラスメソッドのようなjavaの静的メソッドは、クラスのインスタンスの代わりにクラスオブジェクトiselfを使用してアクセスされることです。this
self
static
static
ダイナミックの反対を表すものではないことに注意してください。このキーワードの名前の選択には疑問があり(おそらくCから継承されています)perClass
、意味をよりよく反映するために呼び出されるか、類似している必要があります。技術的な意味は、すべてのstatic
メンバーがクラスローダーごとに1回だけ存在することです。