为什么不可变结构在 Julia 中是默认的?

Jas*_*ett 5 julia

我注意到当 astruct被声明时,它的字段默认是不可变的,除非使用mutable关键字。

这是什么原因?使用可变结构是一种好习惯吗?

Jak*_*sen 10

在 Julia 的 PR 中进行了讨论。我将引用 Jeff Bezanson 的话:

  • 默认情况下,我们应该引导人们使用不可变类型。Immutable 通常更好更快,使用 === 具有更好的默认行为,并且需要更新对象字段的情况非常罕见。Base 的不可变类型比可变类型多得多,在进行这种更改时,在我看来,甚至可以使更多类型成为不可变类型。但是类型 Foo 看起来比不可变的 Foo 更自然,因此类型往往是默认选择。此更改与此相反,结构 Foo 更自然且不可变。编写可变结构 Foo 会让你问“这真的需要可变吗?”,这是一件好事!
  • 不可变结构类型是我们最接近其他语言中的值类型结构的东西。至少在某些情况下,我们将它们内联在数组中,并且不可变使得区分它们是值类型还是引用类型变得更加困难。
  • FWIW,Rust 也使用 struct 并使它们不可变。并不是说我们需要复制 Rust,但它增加了我们相信这是一件合理的事情的信心。

简而言之,不可变类型的性能更高,因为它们可以堆栈分配并且编译器可以更好地推理它们。对于人类来说,它们也更容易推理,因为它们无法在您的控制下发生变化。


Jas*_*ett 1

Julia 具有此功能有以下几个原因:

  1. 结构可以有效地打包到数组中,在某些情况下,编译器可以完全避免为它们分配空间。

  2. 使用不可变结构的代码对于读者来说更容易处理。

  3. 类型的不变量永远不会被违反。

一般来说,使用可变结构是不好的做法,因为更改对象的内部可能会导致违反其不变量。mutable仅当绝对必要时才应使用关键字声明结构。