2012-08-22 55 views

回答

40

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

不好意思選擇這個,但是第一個'p self'實際上是在解析類定義的時候執行的。 'h = Hello.new'實際上會返回與'h.foo'相同的值。我提到這一點是爲了防止列出的輸出可能誤導一些新的Rubyist。 – lilole

5

在類self的實例方法是指該實例。要獲得實例中的課程,您可以撥打self.class。如果您在類方法中調用self,您將獲得該類。在類方法中,您無法訪問該類的任何實例。

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 
+0

不要忘記類方法 – ahnbizcad

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 > 

您會看到在類聲明期間執行的放置#1。它顯示class A是類型爲id == 85789490的對象。所以在類聲明自我中就是指類。

然後,當類方法被調用(#4)self裏面的類方法(#2)再次引用該類。

當調用一個實例方法(#5)時,它顯示它內部(#3)self引用該方法所連接的類實例的對象。

如果您需要引用實例方法中使用類self.class

1

可能是你需要:自己的方法?

1.itself => 1 
'1'.itself => '1' 
nil.itself => nil 

希望這有助於!

相關問題