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.foo
self
my_object
と型操作、または固有クラスを操作するための宣言をself
使用して、ブロックのコンテキスト内で再定義する方法があります。instance_eval
class_eval
class << self