【问题标题】:Classes and class return variables类和类返回变量
【发布时间】:2014-02-12 16:07:26
【问题描述】:

我需要一个类来返回另一个类,但没有这样做。你能解释一下为什么会这样吗?这里我不包括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,但是没有用。

【问题讨论】:

  • 旁注:你为什么不做Fahrenheit::Temperature
  • this 问题之后,您似乎仍然感到困惑。您不是试图在此处返回 classes,而是试图返回另一个类的 instances。有很大的不同。
  • @Max 你是对的 :)

标签: ruby class return-value


【解决方案1】:

华氏度而不是温度

这是正确的,因为::new 构造函数返回了一个新创建的类实例,它被指定为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

【讨论】:

  • @sawa 什么是 AYBABTU? =)
  • 很容易在网上搜索。如果你不能,试着找到“你所有的基地都属于我们”。
  • @sawa 好的,但在这种情况下是什么意思?
  • 看看你的原件。
  • 您在自己的文本中找不到指向"is belonged" 的内容,这真是令人惊讶。
【解决方案2】:

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

如果您不打算创建 Celsius 和 Fahrenheit 类的实例,那么它们可能一开始就不应该是类。在这种情况下,如果您的 Temperature 类具有类方法 celsiusfahrenheit,这对我来说似乎是最明智的。

【讨论】:

  • 嗯,问题是确实需要创建类 Celsius & Fahrenheit 。尝试做一些练习。 :/ 对这样简单的事情阻止我继续前进感到困扰 :/
  • 你让我找到了正确的方向!我就是这样写的>``
  • 你让我找到了正确的方向!我就是这样写的>class Celsius def.self.new(cel) return Temperature.new({:c =&gt; cel}) end end
【解决方案3】:

只是为了显示结果代码。 如此简单,但我仍然不得不问:)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-16
    • 2023-01-29
    • 1970-01-01
    • 1970-01-01
    • 2015-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多