2015-08-28 44 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