Rubyのselfキーワードの使い方 質問する

Rubyのselfキーワードの使い方 質問する

私が理解しているところによるとself、 はクラスの現在のインスタンスを指します。

これは常にデフォルトの動作ではないでしょうか?例えば、

self.var_one = method(args)

に相当

var_one = method(args) 

もしそうなら、 の用途は何ですかself?

ベストアンサー1

重要な用途はいくつかありますが、そのほとんどは基本的にインスタンス メソッド、クラス メソッド、および変数を区別することです。

まず、クラスメソッドを定義する最良の方法は次のとおりです。

class Foo
  def self.bar
    "class method bar"
  end

  def bar
    "instance method bar"
  end
end

Foo.bar  #returns "class method bar"

foo = Foo.new
foo.bar #returns "instance method bar"

また、インスタンス メソッド内ではselfインスタンスを参照し、クラス メソッド内ではクラスを参照し、常にローカル変数と区別するために使用できます。

class Bar
  def self.foo
    "foo!"
  end

  def baz
    "baz!"
  end

  def self.success
    foo #looks for variable foo, doesn't find one, looks for class method foo, finds it, returns "foo!"
  end

  def self.fail
    baz #looks for variable baz, doesn't find one, looks for class method baz, doesn't find one, raises exception
  end

  def instance_success
    baz #looks for variable baz, doesn't find one, looks for instance method baz, finds it, returns "baz!"
  end

  def instance_fail
    foo #looks for variable foo, doesn't find one, looks for instance method foo, doesn't find one, raises exception
  end

  def local_variable
    baz = "is my favorite method"
    baz #looks for variable baz, finds it, returns "is my favorite method"
  end

  def disambiguate
    baz = " is my favorite method"
    self.baz + baz #looks for instance method baz, finds it, looks for local variable baz, finds it, returns "baz! is my favorite method"
  end
end

したがって、結局のところ、self多くの場合は の使用を避けることができますが、後で誤って名前の競合が発生しないようにするために を使用すると役立つことがよくあります。 場合によっては、非常に見つけにくいバグが発生する可能性があります。 結局のところ、これは個人のスタイルの問題であることがよくあります。


コメントにもあるように、もう一つ本当に重要なことがあります。

クラスに次のようなメソッドがあるとします。

def bar=(string)
  ...
end

別のメソッドでは、次のように呼び出します。

def other_method
  bar = "abcd"
end

これはメソッドを呼び出すのではなくbar=、ローカル変数を作成しますbar。したがって、この場合は、を使用してselfRuby にローカル変数を作成しないように指示します。

def other_method
  self.bar = "abcd"
end

メソッド名を持つ引数を取る場合も同様です。

def example
  ...
end

def other_thing(example)
  self.example(example)
end

省略した場合、selfRuby は同じ名前のローカル変数を意味していると想定します。

したがって、一般に、selfメソッド名ではクラス変数とインスタンス変数を区別するために使用され、その他のすべての場所では、Ruby がメソッド呼び出しとローカル変数またはローカル変数の割り当てを区別する必要がある場合に使用されます。

それが意味を成すといいのですが。

おすすめ記事