在ruby中使用Classname.new关键字有什么原因,除了在main中创建对象的实例之外

在ruby中使用Classname.new关键字有什么原因,除了在main中创建对象的实例之外,ruby,Ruby,该类接受散列,并根据输入转换温度 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 class-Temp d

该类接受散列,并根据输入转换温度

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
class-Temp
def初始化(opt={})
如果选择,包括:(:冷)
@colddegree=opt[:cold]
结束
结束
def自冷(cel)

Temp.new(:cold=>cel)Rubyists并不总是使用这个词,但是
self.from\u cold
是一个词。这允许您公开一个
Temp.from_cold(-40)
方法签名,使用您的API的程序员可以很容易地理解该签名,而无需关心样板文件,例如,了解您有一个名为
:cold的隐式必需参数


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

,一个重要的事情是理解不同于C,JavaScript或C++,Ruby不是Ruby中的关键字。它只是类
class
的对象理解的一条消息。默认行为是分配和初始化该类的新对象,但没有任何东西阻止您重写它,例如:

class Foo
  def self.new
     puts "OMG i'm initializing an object"
     super
  end
end
因此,为了回答您的最后一个问题,调用
Temp.new
的位置没有区别。在所有情况下,它都会将消息
new
发送到对象
Temp
(这也是一个类,但请记住,Ruby中几乎所有的东西都是一个对象,包括类),它创建并返回一个新实例


我不打算回答你的另外两个问题,因为另一个答案已经回答了。

你知道这个新对象实际上是从方法返回的吗?我不这么认为,它从方法返回是什么意思?请解释一下,因为这可能会结束我的困惑Ruby的隐式返回帮助。您键入的大多数内容都是返回值的表达式。带有一行
Temp.new
的方法将创建一个新的Temp对象(它运行自己的
initialize()
方法),然后返回初始化的
Temp
对象
self.from_cold
创建一个带有
:cold
值的
Temp
对象,然后返回新初始化的对象,供您使用<代码>定义我们应该恐慌吗?;天塌下来了?;end
是一个简单的例子。如果天塌下来了,我们应该惊慌失措。在ruby中,执行的最后一行结果是该方法的返回值。@Daniel J.Pritchett,哦,这就解释了,我不知道调用运行自己的初始化方法,ok现在更有意义了,谢谢!谢谢你的回复,这让我对工厂方法有了更好的理解,但我对在其他地方创建常规方法以外的实例的概念仍然不清楚。我有一个Rails应用程序,它导入了大量未完全标准化的旧地址数据。我使用一个名为Carmen的库为我提供标准化国家代码和地区代码的列表(例如美国->田纳西州)。Carmen并没有完全解决我所有的问题,所以我将它包装在一个CarmenLookup类中,该类尝试对Carmen的数据集使用几种不同的模糊匹配策略。但是我的ImportAddress类并不关心,它只调用CarmenLookup.find_country(“Unit ed State”),创建和操作对象的混乱事务由CarmenLookup.ok在后台处理,所以这样做对其他人来说并不明显,但我想知道什么时候我应该知道我必须在类方法内创建一个实例,是否总是需要在类方法内创建一个实例?是调用initialize方法的Temp.new(param),如果是,那么为什么我不能只初始化(:cold=>cel)而不是Temp.new(:cold=>cel),因为我们在类中。我知道这是个奇怪的问题,但我想知道这个概念……谢谢!:)虽然我们在下面的评论中谈到了这一点,但我想向Sandi Metz的书《Ruby中的实用面向对象设计》提出我最强烈的建议。她很快就会让你想对的。我肯定会读的,因为面向对象对我来说很难理解..谢谢:)你说我可以在课堂上的任何地方调用class.new,但是class方法会对该对象做什么,现在,它是从类方法调用的,并且类方法可以对该对象执行任何操作——对象本身不知道或不关心它是在顶层创建的,还是在类方法中创建的,或是在实例方法中创建的,或是其他任何东西