Ruby中有一个方法引用类的当前实例,方式是self
引用类本身吗?
答案 0 :(得分:44)
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
答案 1 :(得分:5)
在类self
的实例方法中,引用该实例。要在实例中获取课程,您可以致电self.class
。如果您在类方法中调用self
,则会获得该类。在类方法中,您无法访问该类的任何实例。
答案 2 :(得分:3)
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
答案 3 :(得分:2)
方法self
指的是它所属的对象。类定义也是对象。
如果在类定义中使用self
,则它引用类定义的对象(对于类)如果在类方法中调用它,它会再次引用该类。
但是在实例方法中,它引用的是作为类的实例的对象。
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
是Class类型的对象,其id == 85789490。所以在类声明中self指的是类。
然后当调用类方法时(#4){1}}类方法(#2)再次引用该类。
当调用实例方法时(#5),它显示在其中(#3)self
引用该方法附加到的类实例的对象。
如果您需要在实例方法中引用该类,请使用self
答案 4 :(得分:2)
你可能需要:本身方法吗?
1.itself => 1
'1'.itself => '1'
nil.itself => nil
希望这有帮助!