Ruby 中的符号是用构造函数还是初始化函数制作的?

Are Symbols in Ruby Made with Constructors or Initializers?

在对 this SO question Jörg W Mittag 的回答中说:

There is no such thing as a constructor in Ruby.

我并没有多想,直到我阅读了 Wikipedia article on constructors,其中指出:

Immutable objects must be initialized in a constructor.

由于符号在 Ruby 中是不可变的,它们是如何制作的?维基百科似乎认为它们必须由构造函数构成,但 Jörg 说 Ruby.

中没有构造函数

总的来说,我对 OOP 概念和编程还很陌生,所以我可能遗漏了一些相当基本的东西,但从我的角度来看,这些来源之间存在矛盾。

当人们说

There is no such thing as a constructor in Ruby.

他们的意思是没有对应于构造函数的特殊方法类型,就像 C++ 和 Java.

在Ruby中,initialize方法按照惯例用于初始化一个新对象。然而,它并不是一个特殊的方法——它就像 Ruby.

中的任何其他方法一样

符号 'initialized' 在 ruby 运行时的一些黑暗内部部分,您无需担心。

如果您在 ruby 中创建自己的不可变 class,则必须在 "constructor" 中对其进行初始化,这在 ruby 中意味着在 [=10] 中=] 方法。 initialize 方法在技术上可能是也可能不是构造函数,但它是在实例化对象时调用的方法,这是维基百科文章的重点——因为不可变对象一旦创建就不能更改,任何状态必须在创建时设置,而不是稍后设置。

维基百科文章称此为 'a constructor',但不同的语言使用不同的术语或确切的结构,因此维基百科文章并未考虑 ruby。对于 ruby,"place you can set state on object instantiation" 通常是初始化方法。 (我说 'typically',因为如果你尝试,你可以在 ruby 中做各种疯狂的事情)。维基百科的文章仍然是正确的,如果一个对象真的是不可变的,那么任何状态设置都恰好发生在对象创建时,而不是后记——这就是 'immutable' 的意思,对吧?

这是由 ruby 源代码实现的不可变 classes。但祝你好运找到符号的 'initialize' 方法。他们不是那样工作的。它们只是由 ruby 本身提供,由运行时提供,我们无需担心细节。