Ruby实例方法和变量

时间:2014-02-09 19:05:17

标签: ruby class variables methods instance

有些东西我不了解ruby 类实例变量或方法** 。 所以我有这个代码,一直给我这个错误,我不能理解

看起来ruby认为我正在尝试调用Float.in_celsius,但我想在我的类实例中进行此调用。

#-----------------------------------
def ftoc(fr)
fr = fr.to_f
if (fr == 32)
    c = 0
elsif (fr == 212)
    c = 100
else 
    c = (fr-32.0)*(5.0/9.0)
end

return c
end

def ctof (cl)
cl = cl.to_f
f = (cl*(9.0/5.0))+32.0
return f
end
#-----------------------------------

class Temperature
attr_accessor :in_celsius, :in_fahrenheit 

#class metods 
def self.from_celsius(cel)
    puts "from celsious\n"
    puts "cel: #{cel}\n"
    @in_fahrenheit = cel
    @in_celsius = ctof(cel)
    puts "==============================\n"
    return @in_celsius
end

def self.in_celsius
    @in_celsius
end


end


puts "==============================\n"
puts Temperature.from_celsius(50).in_celsius
puts Temperature.from_celsius(50).in_fahrenheit

和错误是 test.rb:54: in '<main>' : undefined method 'in_celsius' for 122.0:float (noMethod Error) enter code here

3 个答案:

答案 0 :(得分:3)

你对Ruby中的类如何工作存在根本的误解。现在,所有变量和方法都在类级别中定义。这意味着您在方法中执行的所有操作都直接在类本身上执行。相反,您应该创建Temperature实例

class Temperature
  # special method called when creating a new instance
  def initialize celsius
    @in_celsius = celsius
    @in_fahrenheit = celsius * 9 / 5.0 + 32
  end

  def self.from_celsius celsius
    new celsius # built in method to create an instance, passes argument to initialize
  end

  # we defined initialize using celsius, so here we must convert
  def self.from_fahrenheit fahrenheit
    new((fahrenheit - 32) * 5 / 9.0)
  end

  private_class_method :new # people must use from_celsius or from_fahrenheit

  # make instance variables readable outside the class
  attr_accessor :in_celsius, :in_fahrenheit
end

Temperature.from_celsius(50).in_celsius

此代码并不完美(from_fahrenheit执行冗余转换)但它应该让您了解如何重新设计类。

答案 1 :(得分:0)

from_celsius返回一个没有in_celsius方法的float。你需要它来返回一个具有该方法的Temperature实例。

不得不说你的意图有点令人困惑,除非你对温度等级有其他一些用途,所以很难说你应该走哪条路。

答案 2 :(得分:0)

让我们详细了解代码puts Temperature.from_celsius(50).in_celsius

  1. 调用::from_celsius类的单例方法Temperature。没关系(有些奇怪),由于Float方法的结果,t作为#ctof类的实例返回。

  2. 调用对象的实例方法#in_celsius,该方法从上一个方法返回。由于它是Float解释器会搜索其实例方法#in_celsius,因此找不到它,并抛出NoMethodError异常。

    < / LI>

    如何解决。

    由于您将::from_celsius视为Temperature类的构造函数,我相信,您将shell传递给new方法并返回创建的对象。您将拥有以下类代码:

    def initialize( value )
       @in_fahrenheit = cel
       @in_celsius = ctof(cel)
    end
    
    def self.from_celsius(cel)
       puts "from celsious\n"
       puts "cel: #{cel}\n"
       temp = Temperature.new( cel )
       puts "==============================\n"
       return temp
    end