类和类返回变量

时间:2014-02-12 16:07:26

标签: ruby class return-value

我需要一个类来返回另一个类,但是没有这样做。你能解释一下为什么会这样吗?在这里,我不包括Temperature课,因为我认为这是无关紧要的。

class Celsius
  attr_accessor :temp
  def initialize(cel)
    return Temperature.new({:c =>cel})
  end
end

class Fahrenheit
  def initialize ( far )
    Temperature.new({:f => far})
  end
end 

我想调用Fahrenheit类来返回Temperature

puts Fahrenheit.new(0) #=> returns  Fahrenheit class instead of Temperature 

Celsius中,我尝试使用return,但它没有帮助。

3 个答案:

答案 0 :(得分:2)

  

华氏度而不是温度

这是正确的,因为::new consctuctor返回一个新创建的类实例,该实例已指定为Temperature。但#initialize实际上不是类构造函数,它只是一个初始化回调方法。

您可以使用以下方案:

far = Fahrenheit.new( 0 )
far.to_c # => Celsius

和方案的Fahrenheit类:

class Fahrenheit
   def initialize( far )
      @temp = far
   end

   def to_c
      Celsius.new @temp
   end
end

为了检测该类是否属于Temperature类,只需从中继承Fahrenheit,并检查如下:

class Fahrenheit < Temperature
end

far = Fahrenheit.new
far.is_a?( Temperature )
# => true

答案 1 :(得分:1)

initialize不会以任何方式使用new的返回值,因此从initialize返回内容无效。让Foo.new返回Foo之外的其他内容的唯一方法是直接覆盖new,但这通常不是一个好主意,因为它会让您的代码读者感到非常困惑

如果您无意创建Celsius和Fahrenheit类的实例,那么它们可能不应该是第一个类。在这种情况下,如果您的Temperature班级有类方法celsiusfahrenheit,那么对我来说似乎最明智。

答案 2 :(得分:0)

只是为了显示结果代码。 这么简单,但我还是要问:)

class Celsius
    def.self.new(cel)
        return Temperature.new({:c => cel})
    end
end