像`self`这样引用实例的Ruby方法

时间:2012-08-22 17:01:43

标签: ruby oop

Ruby中有一个方法引用类的当前实例,方式是self引用类本身吗?

5 个答案:

答案 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
希望这有帮助!