2015-08-28 47 views
4

我有以下代碼:範圍與「自我」的關鍵字

def self.ftoc(temp_in_fahrenheit) 
    (temp_in_fahrenheit - 32) * 5.0/9.0 
end 

def self.ctof(temp_in_celcius) 
    (temp_in_celcius * 9.0/5.0) + 32 
end 

def calculate_temperatures 
    @f = Temperature.ctof(@c) if (@f == nil && @c != nil) 
    @c = Temperature.ftoc(@f) if (@c == nil && @f != nil) 
end 

這工作得很好。但是,如果我改變了代碼

def calculate_temperatures 
    @f = self.ctof(@c) if (@f == nil && @c != nil) 
    @c = self.ftoc(@f) if (@c == nil && @f != nil) 
end 

我得到的

undefined method 'ftoc' for #<Temperature:0x000000025486a0 @f=50> 

我本來以爲「自我」,作爲類溫度的情況下,將能夠使用ctof錯誤/ ftoc方法,但事實並非如此。有人能幫助我理解我錯過了什麼嗎?

非常感謝。

回答

2

內部方法self實例Temperature。在class內部,它是Class的一個實例,名稱爲Temperature

試試這個:

class Temperature 
    puts "Inside class: self is #{self}, Temperature is #{Temperature}" 

    def meth 
    puts "Inside method: self is #{self}, Temperature is #{Temperature}" 
    end 
end 

Temperature.new.meth 

這就是說,裏面class,這些都是等價的:

class Temperature 
    def self.meth ; end 
    def Temperature.meth ; end 
end 

但是這裏面methodself成爲實例變量,常量TemperatureClass例如,仍然是指你的預期。

要從內部實例方法中引用它的類,可以使用self.class。這就是說,內部實例方法,這些都是等價的:

class Temperature 
    def meth 
    Temperature.ctof(...) 
    self.class.ctof(...) 
    end 
end 
+0

謝謝!我將以此作爲答案,因爲我的困惑源於'自我'根據使用位置而變化的事實,這有助於我理解這一點。 – mikeappell

1

ftocctof是類方法,因爲你指定在聲明中self關鍵字。 另一方面,calculate_temperatures是一種實例方法。

你應該爲了訪問實例方法類方法做什麼用self.class

def calculate_temperatures 
    @f = self.class.ctof(@c) if (@f == nil && @c != nil) 
    @c = self.class.ftoc(@f) if (@c == nil && @f != nil) 
end 
+0

感謝您的回覆。 self.class.ctof比Temperature.ctof或Temperature :: ctof更好還是更好? – mikeappell

+1

是的,使用'self.class'將會緩解多態的使用。另外,閱讀代碼比較容易,並且明白所調用的類方法是在與實例方法調用方相同的類層次結構上定義的。 –

+0

很高興知道,再次感謝。 – mikeappell