Rom*_*man 1 type-inference rust
根据文档,我们有左值和右值上下文。我如何知道表达式是否在左值上下文中?它是否仅由赋值中的表达式确定?
更具体地讲,我需要了解何时DerefMut用于取消引用以及何时用于反引用Deref?与Index和相同IndexMut。
您在这里问两个不同的问题。
更具体地说,我需要了解,什么时候
DerefMut用于取消引用,什么时候Deref代替?与Index和相同IndexMut。
这仅取决于结果值是否可更改地使用。使用属于这些特征([]和*)的运算符的表达式始终是左值表达式。
现在,您的问题更加复杂:
我如何知道表达式是否在左值上下文中?它是否仅由赋值中的表达式确定?
回顾一下:什么是右值/左值表达式?
哪些表达式是左值表达式,哪些是右值表达式?只有几个l值表达式:
foo[3])*foo)foo.bar)右值/左值上下文呢?这些上下文是表达式内的“槽”。例如,表达式“ modulo”(%)具有其中两个插槽,第一个和第二个操作数:?first? % ?second?。现在,这些上下文也具有两种不同的风格:
那么哪些插槽是右值,哪些插槽是左值上下文?幸运的是,l值上下文的数量非常有限,因此下面是完整列表:
?lvalue context? = ...;或?lvalue context? += ...;)的左侧&?lvalue context?和&mut ?lvalue context?)的操作数ref出现a的模式时(例如let ref x = &?lvalue context?;)让我们看看我们可以在哪种上下文中使用哪些表达式:
3上的分配的右手侧)&mut 3