范围和 'self' 关键字
Scope and the 'self' keyword
我有以下代码:
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>
我原以为 'self' 作为 class Temperature 的一个实例,可以使用 ctof/ftoc 方法,但事实并非如此。有人可以帮助我了解我所缺少的吗?
非常感谢。
内部方法 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
成为实例变量,而常量 Temperature
,Class
的实例,仍然引用您所期望的。
要从实例方法内部引用它的 class,可以使用 self.class
。也就是说,在实例方法内部,它们是等价的:
class Temperature
def meth
Temperature.ctof(...)
self.class.ctof(...)
end
end
ftoc
和 ctof
是 class 方法,因为您在声明中指定了 self
关键字。
另一方面,calculate_temperatures
是一个实例方法。
为了在实例方法中访问 class 方法,您应该做的是使用 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
我有以下代码:
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>
我原以为 'self' 作为 class Temperature 的一个实例,可以使用 ctof/ftoc 方法,但事实并非如此。有人可以帮助我了解我所缺少的吗?
非常感谢。
内部方法 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
成为实例变量,而常量 Temperature
,Class
的实例,仍然引用您所期望的。
要从实例方法内部引用它的 class,可以使用 self.class
。也就是说,在实例方法内部,它们是等价的:
class Temperature
def meth
Temperature.ctof(...)
self.class.ctof(...)
end
end
ftoc
和 ctof
是 class 方法,因为您在声明中指定了 self
关键字。
另一方面,calculate_temperatures
是一个实例方法。
为了在实例方法中访问 class 方法,您应该做的是使用 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