Ruby实例方法和变量

有些东西我不了解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 '' : undefined method 'in_celsius' for 122.0:float (noMethod Error) enter code here

您对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会进行冗余转换),但它应该让您了解如何重新设计类。

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

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

让我们看一下代码中的puts Temperature.from_celsius(50).in_celsius

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

  2. 调用object的实例方法#in_celsius ,它是从前一个方法返回的。 由于它是Float , ruby解释器搜索它的实例方法#in_celsius ,但是没有找到它,并抛出NoMethodErrorexception。

怎么修。

由于您将::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