范围和自我'关键字

时间:2015-08-28 16:57:24

标签: ruby scope self

我有以下代码:

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>

我原以为&#39; self&#39;作为类Temperature的一个实例,可以使用ctof / ftoc方法,但事实并非如此。有人可以帮我理解我错过的东西吗?

非常感谢。

2 个答案:

答案 0 :(得分: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

但在method内,self变为实例变量,而常量TemperatureClass的实例仍然是指您所期望的。

要从实例方法内部引用它的类,可以使用self.class。也就是说,在实例方法中,这些是等价的:

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

答案 1 :(得分: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