【问题标题】:Is the term immutable variable just a convention?术语不可变变量只是一个约定吗?
【发布时间】:2020-01-23 21:11:30
【问题描述】:

默认情况下,Rust 中的变量是不可变的,即它们不会变化但不是常量(如 here 所述)。

他们是否只是按照惯例保留了名称“variable”,还是保留了术语“variable”的其他原因?

【问题讨论】:

  • 数学变量也是无状态的。

标签: variables rust


【解决方案1】:

应该注意的是,Rust 中的 mut 一词在稳定之前曾引起激烈争论,一些人认为它应该被称为 excluniq。问题是let mut x&mut x中的mut是两个完全不同的东西。

let mut x 声明 x 是可变的,在某种意义上它可以重新分配,但也可以使用 &mut 引用它;最好将其称为独家唯一参考。例如,在 std::cell::Cell 的情况下,在某些情况下,Rust 很可能通过 shared 引用进行变异,并且并非所有需要独占引用的操作都涉及变异。需要独占引用的操作只是共享引用不安全的操作。 Cell 的设计方式是,通过严格控制在什么条件下可能发生突变,它不会发生。

理论上,let mut x 的两个函数可以有不同的关键字,但为了简单起见,它们被压缩为一个。 Rust 理论上可以设计为 mutexcl 是不同的关键字,并允许 let excl x,这将是一个变量,可以从中获取独占引用,但不能变异。

也可以有没有用mut 声明的变量,特别是在函数调用中。在像fn func ( x : u32 ) 这样的签名中,x 不是可变的,而是可变的,因为每次都可以传递不同的x

let mut x 类型的“可变”纯粹是一种 lint,理论上,Rust 没有必要工作 - 任何当前工作的 Rust 程序都将继续工作如果所有非可变变量都变为可变的。这样做只是被认为是不好的做法,并且编译器会在程序员使不需要可变的变量可变时警告程序员;这有助于捕捉意外的错误。独占和共享引用绝对不是这种情况,它们是区分的必要条件,而不仅仅是 lint。

【讨论】:

  • 在像fn func ( x : u32 ) 这样的签名中,x 是不可变的,但它是可变的,因为每次都可以传递不同的 x。 我认为这是必要的观察。可变/独特的区别很有趣,但也很切题。
  • 请您详细说明 lint(在最后一段)? @trentcl 也指出了我同意的关键点。
  • @darkacts 是的,这确实是数学函数中变量的精髓;对于给定的实例,它们可以用任何不同的值进行实例化,但它们不会按顺序变异,因为它们是无状态和永恒的; “lint”是一个术语,用于表示不需要正确性但能够更好地诊断和捕获错误的代码部分——相当多的语言都有这样的特性。
【解决方案2】:

这里的“变量”是指“参与计算的因素”而不是“变化”。这是从数学原理出发的,其中像 f(x) 这样的表达式将变量 x 作为方程的一部分。

在 Rust 中,与其他语言一样,您需要影响程序运行方式的变量(例如输入),否则您的程序只会以单一、特定的方式运行,每次都会产生相同的输出。

您需要考虑在处理过程中哪些变量会发生变化,哪些不会。不需要改变的不需要声明为可变的。

无论它们是否或何时发生变化,它们仍被视为变量

在 C++ 中,您将拥有像 const int x 这样的东西,它是一个常量(只读)变量,因此该术语可以具有各种特定含义。

【讨论】:

    【解决方案3】:

    术语不可变变量只是一种约定吗?

    根据定义每个...一个词的定义是一种约定,语言,词的含义,随时间而变化,对于每个活着的人来说都是独一无二的,你可以带上 100 个人,并以 100 个不同的定义结束 1 个词.这就是为什么我们经常通过定义论文中可能无法理解的单词来开始科学论文。试图尽可能地澄清。 Rust 与为什么我们有 The Reference

    没有什么不同

    我们有一个专门针对 variable 的部分

    变量是堆栈帧的一个组件,或者是一个命名函数 参数、匿名临时变量或命名的局部变量。

    一个局部变量(或堆栈局部分配)直接保存一个值, 在堆栈的内存中分配。该值是堆栈的一部分 框架。

    除非另有声明,否则局部变量是不可变的。例如: 让 mut x = ....

    函数参数是不可变的,除非用 mut 声明。穆特 关键字仅适用于以下参数。例如:|mut x, 是| fn f(mut x: Box, y: Box) 声明一个可变变量 x 和一个不可变变量 y。

    局部变量在分配时未初始化。相反, 在帧入口处分配整个帧的局部变量, 处于未初始化状态。函数中的后续语句可能 或者可能不会初始化局部变量。可以使用局部变量 只有在它们通过所有可达控制初始化后 流动路径。

    所以没有什么要补充的,rust 中的变量是明确定义的,如果你的定义不匹配或者你发现变量的定义与 Rust 不匹配都没关系。在 Rust 的上下文中,变量就是这样。如果您想询问有关此选择的意见,则以意见为导向,这是题外话。但是,wiki 的定义使得 Rust 定义无论从数学角度还是从计算机科学角度来看都相当标准:

    变量(计算机科学),与值关联的符号名称,其关联值可以更改

    变量(数学),在数学表达式中表示数量的符号,用于许多科学

    【讨论】:

    • 那么下面的说法正确吗? Rust 无缘无故地使用术语变量,只是它在文档中的定义方式(类似于它在计算机科学和数学中的定义)。
    • @darkacts 不,这是历史和起源的原因,但最终并不重要。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-06
    • 2011-08-19
    • 2021-12-25
    • 2018-07-31
    • 2013-02-16
    • 1970-01-01
    • 2021-12-13
    相关资源
    最近更新 更多