self.property_nameRuby ではいつ使用しますか?
3 に答える
クラスのミューテーターを呼び出すときは、selfを使用します。たとえば、これは機能しません。
class Foo
attr_writer :bar
def do_something
bar = 2
end
end
問題は、attr_writerによって作成されたメソッド'bar ='を呼び出すのではなく、'bar=2'が'bar'という名前のローカル変数を作成することです。ただし、少しself修正すると次のようになります。
class Foo
attr_writer :bar
def do_something
self.bar = 2
end
end
self.bar = 2必要に応じて、メソッドを呼び出しbar=ます。
selfを使用して、ローカル変数と同じ名前のリーダーを呼び出すこともできます。
class Foo
attr_reader :bar
def do_something
bar = 123
puts self.bar
end
end
ただし、通常は、ローカル変数にアクセサーと同じ名前を付けないようにすることをお勧めします。
self現在のオブジェクトを参照します。これは多くの用途に役立ちます:
現在のオブジェクトでメソッドを呼び出す
class A
def initialize val
@val = val
end
def method1
1 + self.method2()
end
def method2
@val*2
end
end
ここで runningA.new(1).method1()は を返し3ます。ここでの使用selfはオプションです。次のコードは同等です。
class A
def initialize val
@val = val
end
def method1
1 + method2()
end
def method2
@val*2
end
end
selfただし、この目的には冗長ではありません-演算子のオーバーロードにより必要になります。
class A
def initialize val
@val = val
end
def [] x
@val + x
end
def method1 y
[y] #returns an array!
end
def method2 y
self.[y] #executes the [] method
end
end
[]これは、現在のオブジェクトのメソッドを呼び出す場合に self を使用する必要があることを示しています。
属性の参照
attr_accessorand coを使用して、インスタンス変数を読み書きするメソッドを生成できます。
class A
attr_accessor :val
def initialize val
@val = val
end
def increment!
self.val += 1
end
end
ここでself を使用するのは冗長です。変数を直接参照できるからです。@val. 前のクラスを使用すると、A.new(1).increment!2 が返されます。
メソッド連鎖
self を返して、連鎖として知られる構文糖衣の形式を提供できます。
class A
attr_reader :val
def initialize val
@val = val
end
def increment!
@val += 1
self
end
end
ここでは、現在のオブジェクトを返すため、メソッドをチェーンできます。
A.new(1).increment!.increment!.increment!.val #returns 4
クラス メソッドの作成
self を使用してクラス メソッドを定義できます。
class A
def self.double x
x*2
end
def self.quadruple x
self.double(self.double(x))
end
end
これによりA.double(2) #= 4、 およびを呼び出すことができますA.quadruple(2) #=8。selfクラス メソッドでは、クラスが現在のオブジェクトであるため、そのクラスを参照することに注意してください。
自己の価値はどのように決まるか
特定のメソッドの self の現在の値は、そのメソッドが呼び出されたオブジェクトに設定されます。通常、これは「.」を使用します。表記。を実行するsome_object.some_method()と、some_method の間、self は some_object にバインドされます。つまり、some_method は上記のいずれかの方法で self を使用できます。
is used を使用selfすると、プログラム内でアクセス可能な現在のオブジェクトが参照されます。attr_accessorしたがって、何らかの種類のを介して変数にアクセスする場合は、self.property が使用されます。必要に応じて、オブジェクト内から @property の代わりに使用できます。