Jak*_*sen 10
这在 Julia 的 PR 中进行了讨论。我将引用 Jeff Bezanson 的话:
- 默认情况下,我们应该引导人们使用不可变类型。Immutable 通常更好更快,使用 === 具有更好的默认行为,并且需要更新对象字段的情况非常罕见。Base 的不可变类型比可变类型多得多,在进行这种更改时,在我看来,甚至可以使更多类型成为不可变类型。但是类型 Foo 看起来比不可变的 Foo 更自然,因此类型往往是默认选择。此更改与此相反,结构 Foo 更自然且不可变。编写可变结构 Foo 会让你问“这真的需要可变吗?”,这是一件好事!
- 不可变结构类型是我们最接近其他语言中的值类型结构的东西。至少在某些情况下,我们将它们内联在数组中,并且不可变使得区分它们是值类型还是引用类型变得更加困难。
- FWIW,Rust 也使用 struct 并使它们不可变。并不是说我们需要复制 Rust,但它增加了我们相信这是一件合理的事情的信心。
简而言之,不可变类型的性能更高,因为它们可以堆栈分配并且编译器可以更好地推理它们。对于人类来说,它们也更容易推理,因为它们无法在您的控制下发生变化。
Julia 具有此功能有以下几个原因:
结构可以有效地打包到数组中,在某些情况下,编译器可以完全避免为它们分配空间。
使用不可变结构的代码对于读者来说更容易处理。
类型的不变量永远不会被违反。
一般来说,使用可变结构是不好的做法,因为更改对象的内部可能会导致违反其不变量。mutable仅当绝对必要时才应使用关键字声明结构。