self私はそのキーワードについて完全に迷子になりました。モジュール、クラス、メソッド、ブロック、またはその他すべてに入ると、どのように変化しますか?誰か私に要約を教えてもらえますか?
ここで私は、自己が何を意味するのかではなく、実行に伴って自己がどのように変化するのかを尋ねています。
self常に現在のオブジェクトを参照します。
class A
p self # => A
def foo
p self # => instance of A
end
end
module M
p self # => M
end
A.new.foo
いくつものものを参照するJavaScriptとは異なりthis、Rubyではself常に現在のメソッドの実行コンテキストを参照します。
classメソッド内でself、クラス自体を参照します。
class FooClass
def self.bar
self # => FooClass
end
end
classインスタンスメソッド内で、インスタンスselfを参照します。
class FooClass
def bar
self # => This instance (FooClass#nnnn)
end
end
moduleメソッド内でself、モジュールを参照する場合があります。
module FooModule
def self.bar
self # => FooModule
end
end
モジュールメソッドが経由で混合されるincludeと、インスタンスを参照します。
module FooModule
def bar
self # => (Depends on included context)
end
end
class BarClass
include FooModule
def foo
bar # => This instance (BarClass#nnnn)
end
end
唯一のトリッキーな部分はモジュールであり、他のものがそれらを含むことができるので、それらはトリッキーなだけです。それを最もよく覚える方法は、一般的にドットの左側selfにあるものを指します。つまり、そのメソッドの直接のコンテキストにあるということです。my_object.fooselfmy_object
と型操作、または固有クラスを操作するための宣言をself使用して、ブロックのコンテキスト内で再定義する方法があります。instance_evalclass_evalclass << self