Ruby实例方法和变量
关于ruby类实例变量或方法**有一些我不理解的地方。 所以我有这个代码,不断给我这个错误,我不能理解 看起来ruby认为我正在尝试调用Float.in_,但我想在我的类实例中进行此调用Ruby实例方法和变量,ruby,class,variables,methods,instance,Ruby,Class,Variables,Methods,Instance,关于ruby类实例变量或方法**有一些我不理解的地方。 所以我有这个代码,不断给我这个错误,我不能理解 看起来ruby认为我正在尝试调用Float.in_,但我想在我的类实例中进行此调用 #----------------------------------- 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
#-----------------------------------
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'':122.0:float的未定义方法(noMethod错误)
在此处输入代码
from\u celsius返回的浮点值没有in\u celsius方法。您需要它返回一个具有该方法的温度实例
我得说你的意图有点混乱,除非你对类温度还有其他用途,所以很难说你应该走哪条路。你对Ruby中类的工作方式有一个基本的误解。现在,所有变量和方法都是在类级别定义的。这意味着在方法中所做的一切都直接作用于类本身。相反,您应该创建
温度的实例
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_Celse(50)。in_Celse
详细信息:
调用singleton方法::从温度
类的_摄氏度
。这是正常的(有些奇怪),t作为Float
类的实例返回,因为#ctof
方法的结果
调用从上一个方法返回的对象的实例方法。由于它是浮点值
,解释器在摄氏度
中搜索其实例方法,但没有找到它,并抛出NoMethodError
异常
如何修复。
由于您将::from_concerties
视为Temperature
类的构造函数,因此我相信您希望将浮点值传递到新方法中,并返回创建的对象。您将拥有如下类别代码:
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
你可能想用一个模块来做这类事情——就我的2cGrag,你可以把ftoc(fr)
简化为def ftoc(fr)(fr-32.0)*(5.0/9.0)end
。您不需要将fr
转换为浮点,因为fr-32.0
将实现这一点,您也不需要return
,因为Ruby返回最后执行的计算。同样适用于ctof()
@CarySwoveland OP对类实例变量和类实例的实例变量存在混淆。。那需要先解决。嗯,是的。。我的主要问题是这里的类实例变量:/I我认为return@in_Celsiu
没用,所以可以删除它。由于OP有一行attr\u accessor:in_celsius,:in_fahrenheit
,def self.in_celsius..
没有意义,尽管如此。使用类级方法返回温度实例对他来说不起作用either@ArupRakshit你为什么说attr存取器:以摄氏度为单位,以华氏度为单位,def self.in_celsius
没有意义?@Arup Rakshit我对ruby非常陌生,语法对我来说仍然很混乱。我使用的是attr\u访问器:in\u Celses
,因为它是进行Temperature.in\u Celses
调用所必需的。因此,我试图实现的是链接我的请求,正如您在放置温度中所看到的。从摄氏度(50)。在摄氏度@user3290330中,我希望温度是一个值和单位,以及任何改变值和单位的转换。嗯。。这看起来像是我读到的关于Ruby类的东西。。。我想我有个主意,今天晚些时候再试试……谢谢。。。作为回应。。。我还不能为你的回答加上一点,因为我在这里还没有名声。新的((华氏-32)*5/9.0)成功了。我的代码分配不同,但这解决了我的问题。。。非常感谢!