self
クラス自体を参照する方法で、クラスの現在のインスタンスを参照するRubyのメソッドはありますか?
5 に答える
self
は常にインスタンスを参照しますが、クラス自体は のインスタンスですClass
。特定のコンテキストself
では、そのようなインスタンスを参照します。
class Hello
# We are inside the body of the class, so `self`
# refers to the current instance of `Class`
p self
def foo
# We are inside an instance method, so `self`
# refers to the current instance of `Hello`
return self
end
# This defines a class method, since `self` refers to `Hello`
def self.bar
return self
end
end
h = Hello.new
p h.foo
p Hello.bar
出力:
Hello
#<Hello:0x7ffa68338190>
Hello
クラスのインスタンス メソッド内では、self
そのインスタンスを参照します。インスタンス内のクラスを取得するには、 を呼び出すことができますself.class
。self
クラス メソッド内で呼び出すと、クラスが取得されます。クラス メソッド内では、クラスのインスタンスにアクセスできません。
メソッドself
は、それが属するオブジェクトを参照します。クラス定義もオブジェクトです。
self
クラス定義内で使用する場合は、クラス定義のオブジェクト(クラスを参照)を参照します。クラスメソッド内で呼び出すと、クラスを再度参照します。
ただし、instanceメソッドでは、クラスのインスタンスであるオブジェクトを参照します。
1.9.3p194 :145 > class A
1.9.3p194 :146?> puts "%s %s %s"%[self.__id__, self, self.class] #1
1.9.3p194 :147?> def my_instance_method
1.9.3p194 :148?> puts "%s %s %s"%[self.__id__, self, self.class] #2
1.9.3p194 :149?> end
1.9.3p194 :150?> def self.my_class_method
1.9.3p194 :151?> puts "%s %s %s"%[self.__id__, self, self.class] #3
1.9.3p194 :152?> end
1.9.3p194 :153?> end
85789490 A Class
=> nil
1.9.3p194 :154 > A.my_class_method #4
85789490 A Class
=> nil
1.9.3p194 :155 > a=A.new
=> #<A:0xacb348c>
1.9.3p194 :156 > a.my_instance_method #5
90544710 #<A:0xacb348c> A
=> nil
1.9.3p194 :157 >
クラス宣言中に実行されるputs#1が表示されます。class A
これは、id==85789490のClass型のオブジェクトであることを示しています。したがって、クラス宣言内では、selfはクラスを参照します。
次に、クラスメソッドが呼び出されると(#4)、self
クラスメソッド(#2)内で再びそのクラスを参照します。
また、インスタンスメソッドが呼び出されると(#5)、その内部(#3)self
が、メソッドがアタッチされているクラスインスタンスのオブジェクトを参照していることを示します。
インスタンスメソッド内でクラスを参照する必要がある場合は、self.class
参照は常に利用可能であり、それself
が指すオブジェクトはコンテキストによって異なります。
class Example
self # refers to the Example class object
def instance_method
self # refers to the receiver of the :instance_method message
end
end