加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – 范围和’self’关键字

发布时间:2020-12-17 02:24:37 所属栏目:百科 来源:网络整理
导读:我有以下代码: def self.ftoc(temp_in_fahrenheit) (temp_in_fahrenheit - 32) * 5.0/9.0enddef self.ctof(temp_in_celcius) (temp_in_celcius * 9.0/5.0) + 32enddef calculate_temperatures @f = Temperature.ctof(@c) if (@f == nil @c != nil) @c = Tem
我有以下代码:

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’,作为类Temperature的一个实例,将能够使用ctof / ftoc方法,但事实并非如此.有人能帮助我理解我所缺少的东西吗?

非常感谢.

解决方法

内部方法self是Temperature的一个实例.在类中,它是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 Temperature
  def self.meth ; end
  def Temperature.meth ; end
end

但是在inside方法中,self变为实例变量,而恒定的Temperature,Class的实例,仍然指的是你所期望的.

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读