Ruby实例方法和变量

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

关于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

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)成功了。我的代码分配不同,但这解决了我的问题。。。非常感谢!