有些东西我不了解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
答案 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
:
调用::from_celsius
类的单例方法Temperature
。没关系(有些奇怪),由于Float
方法的结果,t作为#ctof
类的实例返回。
调用对象的实例方法#in_celsius
,该方法从上一个方法返回。由于它是Float
,ruby解释器会搜索其实例方法#in_celsius
,因此找不到它,并抛出NoMethodError
异常。
如何解决。
由于您将::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