3

此类接受哈希,并根据输入转换温度。

class Temp
  def initialize(opt={})
    if opt.include?(:cold)
      @colddegree=opt[:cold]
    end
  end
  def self.from_cold(cel)
    Temp.new(:cold => cel) <= instance of class created in class method
  end
end

类的实例是在类方法中创建的。为什么有必要这样做,它做了什么,背后的原因是什么?

  • 为什么我们需要在类而不是主类中创建一个类的实例?
  • 为什么要在类方法中使用它?是否有一段时间在常规对象方法中需要它?
  • 它在调用什么以及在类方法中创建实例时发生了什么?它有什么区别?
4

2 回答 2

9

Rubyists 并不总是使用这个词,而是self.from_cold一个工厂。这使您可以公开Temp.from_cold(-40)使用您的 API 的程序员可以轻松理解的方法签名,而不必关心样板文件,例如,学习您有一个名为 的隐式必需参数:cold

当您有一个需要初始化然后调用的执行工作的对象时,它变得特别有用,例如TempConverter.new(cel: -40).to_fahrenheit. 有时,公开一个TempConverter.cel_to_fahr(-40)供其他库使用的选项会更干净。这主要是一种在此类内部隐藏复杂性的方法,以便其他具有临时转换需求的类不必违反Demeter 定律

于 2013-06-04T14:31:26.993 回答
1

需要理解的重要一点是,与 C#、JavaScript 或 C++ 不同,new 不是 Ruby 中的关键字。这只是类对象Class理解的消息。默认行为是分配和初始化该类的新对象,但没有什么可以阻止您覆盖它,例如:

class Foo
  def self.new
     puts "OMG i'm initializing an object"
     super
  end
end

Temp.new因此,要回答您的最后一个问题,调用的位置没有区别。在所有情况下,它都会将消息发送new给对象Temp(它也是一个类,但请记住,Ruby 中几乎所有东西都是一个对象,包括类),它创建并返回一个新实例。

我不会尝试回答您的其他两个问题,因为其他答案已经回答了。

于 2013-06-04T14:56:44.423 回答