15

self.property_nameRuby ではいつ使用しますか?

4

3 に答える 3

36

クラスのミューテーターを呼び出すときは、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

ただし、通常は、ローカル変数にアクセサーと同じ名前を付けないようにすることをお勧めします。

于 2011-02-21T16:38:47.197 に答える
21

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) #=8selfクラス メソッドでは、クラスが現在のオブジェクトであるため、そのクラスを参照することに注意してください。

自己の価値はどのように決まるか

特定のメソッドの self の現在の値は、そのメソッドが呼び出されたオブジェクトに設定されます。通常、これは「.」を使用します。表記。を実行するsome_object.some_method()と、some_method の間、self は some_object にバインドされます。つまり、some_method は上記のいずれかの方法で self を使用できます。

于 2011-02-21T20:22:56.927 に答える
0

is used を使用selfすると、プログラム内でアクセス可能な現在のオブジェクトが参照されます。attr_accessorしたがって、何らかの種類のを介して変数にアクセスする場合は、self.property が使用されます。必要に応じて、オブジェクト内から @property の代わりに使用できます。

于 2011-02-21T16:30:02.657 に答える