相关疑难解决方法(0)

`mut a:&T`和`a:&mut T`有什么区别?

有人可以解释这两者之间的区别是什么时候mut a: &T最常用的?

reference mutable rust

6
推荐指数
1
解决办法
422
查看次数

Rust可变值vs可变引用

有什么区别

let y = &mut 5;
*y += 1;
let x = *y + 1;
Run Code Online (Sandbox Code Playgroud)

let mut y = 5;
y += 1;
let x = y + 1;
Run Code Online (Sandbox Code Playgroud)

他们返回相同的结果println!,但我不能决定哪一个更好.

reference mutable rust

6
推荐指数
1
解决办法
4203
查看次数

API 设计中的内部可变性滥用?

我的 C++ 背景让我对内部可变性感到不舒服。下面的代码是我围绕这个主题的调查。

我同意,从借用检查器的角度来看,处理每个内部状态可能迟早改变的单个结构上的许多引用是不可能的;这显然是内部可变性可以提供帮助的地方。

此外,在第15.5“RefCell 和内部可变性模式”锈病编程语言,有关的例子Messenger特质及其对实施 MockMessenger结构让我觉得,这是一种常见的API设计,系统地喜欢&self&mut self,即使它很明显,迟早会强制要求某种可变性。Messenger发送消息时如何实现不改变其内部状态?例外只是打印消息,这与 一致&self,但一般情况可能包括写入某种内部流,这可能意味着缓冲,更新错误标志......所有这些当然都需要&mut self,例如 impl Write for File.

依靠内部的可变性来解决这个问题听起来好像是,在C ++中,const_cast荷兰国际集团或滥用mutable成员只是因为在申请的其他地方,我们是不是一致 const岬(对于C ++的学习者常犯的错误)。

所以,回到我下面的示例代码,我应该:

  • 使用&mut self(编译器不会抱怨,即使它不是强制性的)从change_e()change_i()为了与我改变存储的整数值的事实保持一致?
  • 继续使用&self,因为内部可变性允许它,即使我实际上改变了存储的整数的值?

这个决定不仅对结构本身来说是局部的,而且会对使用这个结构的应用程序中可以表达的内容产生很大的影响。第二种解决方案肯定会有很大帮助,因为只涉及共享引用,但它是否与 Rust 中的预期一致。

我在Rust API Guidelines 中找不到这个问题的答案 。是否有任何其他类似于C++CoreGuidelines 的Rust 文档 ?

/*
    $ rustc int_mut.rs && ./int_mut …
Run Code Online (Sandbox Code Playgroud)

api-design rust interior-mutability

6
推荐指数
1
解决办法
677
查看次数

为什么不可变变量可以作为参数传递给需要可变参数的函数?

示例代码?

fn main() {
    let a = [1, 2, 3, 4, 5];
    reset(a);
}

fn reset(mut b: [u32; 5]) {
    b[0] = 5;
}
Run Code Online (Sandbox Code Playgroud)

变量a是一个不可变数组,reset函数的参数b是一个可变数组;直觉上我需要修改a为可变数组才能调用该reset方法,但是编译器告诉我不需要这样做,这是为什么呢?

fn main() {
    let mut a = [1, 2, 3, 4, 5];
    reset(a);
}

fn reset(mut b: [u32; 5]) {
    b[0] = 5;
}
Run Code Online (Sandbox Code Playgroud)
fn main() {
    let a = [1, 2, 3, 4, 5];
    reset(a);
}

fn reset(mut b: [u32; 5]) {
    b[0] = …
Run Code Online (Sandbox Code Playgroud)

variables syntax mutable immutability rust

5
推荐指数
1
解决办法
732
查看次数

在函数参数中,使用ref关键字和使用&符号有什么区别?

在此代码,sref1并且sref2是的地址s,和地址是相同的.ref和之间有什么区别&

fn main() {
    let s = String::from("hello");
    let sref1 = &s;
    let ref sref2 = s;
    println!("{:p}", sref1);
    println!("{:p}", sref2);

    f1(&s);
    f2(s);
}

fn f1(_s: &String) {
    println!("{:p}", _s);
}

fn f2(ref _s: String) {
    println!("{:p}", _s);
}
Run Code Online (Sandbox Code Playgroud)

_sin f1f2也是字符串的地址,f2将取得所有权,但打印f2的地址与打印的地址不同f1.为什么?

rust

5
推荐指数
1
解决办法
139
查看次数

关于引用的可变性和引用所指的值的可变性的一些混淆

我知道 Rust 引用很像 C 指针,并且我一直将 Rust 引用视为 C 指针。经过一些实验和搜索,我很困惑。

\n

我熟悉 C,并且读过What\'s the Difference between Placeing \xe2\x80\x9cmut\xe2\x80\x9d before a variable name and after the \xe2\x80\x9c:\xe2\ x80\x9d?,给出下表:

\n
\n
// Rust          C/C++\n    a: &T     == const T* const a; // can\'t mutate either\nmut a: &T     == const T* a;       // can\'t mutate what is pointed to\n    a: &mut T == T* const a;       // can\'t mutate pointer\nmut a: &mut T == T* a;             // can mutate both\n
Run Code Online (Sandbox Code Playgroud)\n
\n …

reference mutability rust

5
推荐指数
1
解决办法
763
查看次数

如何将 HashMap 传递给 Rust 中的函数

谁能解释为什么下面的代码不能编译?

use std::collections::HashMap;

fn add(mut h: &HashMap<&str, &str>) {
    h.insert("foo", "bar");
}

fn main() {
    let mut h: HashMap<&str, &str> = HashMap::new();
    add(&h);
    println!("{:?}", h.get("foo"));
}
Run Code Online (Sandbox Code Playgroud)

这就是 rustc 告诉我的

hashtest.rs:4:5: 4:6 error: cannot borrow immutable borrowed content `*h` as mutable
hashtest.rs:4     h.insert("foo", "bar");
                  ^
Run Code Online (Sandbox Code Playgroud)

hashmap rust

4
推荐指数
1
解决办法
3859
查看次数

如何在for循环中进行可变借用?

我试过了:

let mut vec = [1,2,3];

for mut x in &vec { *x=3; }
for mut &x in &vec { x=3; }
for mut *x in &vec { x=3; }
for mut x in mut &vec { *x=3; }
for mut x in &(mut vec) { *x=3; }
Run Code Online (Sandbox Code Playgroud)

这些都不起作用; 我该怎么办?

for-loop mutable rust borrowing

4
推荐指数
1
解决办法
5731
查看次数

为什么 rust 在引用可变变量时重新声明可变性?

我正在阅读The Rust Programming Language 的第二章,我不明白的东西在这里引起了我的注意:

use std::io;

fn main() {
    println!("Guess the number!");

    println!("Please input your guess.");

    let mut guess = String::new();

    io::stdin().read_line(&mut guess)
        .expect("Failed to read line");

    println!("You guessed: {}", guess);
}
Run Code Online (Sandbox Code Playgroud)

在代码第 5 行,它用 声明了一个可变变量let mut guess = String::new(),但在下一行,for 的参数read_line()也有一个mut关键字。

如果变量首先被定义为可变的,那么为什么我们mut再次使用而不是像这样只使用引用:

io::stdin().read_line(&guess).expect("Failed to read line");
Run Code Online (Sandbox Code Playgroud)

如果为变量定义了类型,那么当我们使用引用时,类型( mut)不应该默认存在吗?

rust

3
推荐指数
2
解决办法
249
查看次数

使用 FnMut 了解 Iter

由于Iter 的“所有”fn 采用 FnMut 类型,是否可以在检查条件和短路时更新元素?虽然我知道这是不应该的,但是是什么阻止它更新值呢?

fn main() {
   let a = ["as", "zz"];

    let mut iter = a.iter();
    iter.all(|& (mut x)| {x = "cc"; true});

    for z in a.iter(){
        println!("{z}");
    }
}
Run Code Online (Sandbox Code Playgroud)

上面打印

as
zz
Run Code Online (Sandbox Code Playgroud)

在上述情况下,为什么设置“x = cc”不起作用?或者为什么 Iter “all” 方法采用 FnMut 类型的 F 而不是 Fn 当它不应该变异而只验证条件时

rust

3
推荐指数
1
解决办法
141
查看次数

函数参数如何允许改变变量但不能指向任何其他变量?

我想要一个调用其他相互递归函数的函数,但我已经有了这样的类型签名:

fn f1(mut index: &mut usize, ..)
fn f2(mut index: &mut usize, ..)
Run Code Online (Sandbox Code Playgroud)

我真的想要一组相互递归的函数,它们只能改变 index我在main()函数中定义的变量,并且不能指向任何其他变量。

我已经阅读了变量名之前的“mut”和“:”之后的“mut”有什么区别?中的两个答案。,我已经尝试了几种方法,但仍然无法实现我想要的。我想我不太理解这些概念。

这是我目前理解的证据:

// with &mut I can change the referred value of n, but then I can't
// pass a mutable reference anywhere
fn mutate_usize_again(n: &mut usize) {
    *n += 1;
    // n += 70; ^ cannot use `+=` on type `&mut usize`
}

fn mutate_usize_two_times(mut n: &mut usize) {
    *n = 8;
    // if I don't write mut …
Run Code Online (Sandbox Code Playgroud)

reference mutable immutability rust

0
推荐指数
1
解决办法
1176
查看次数

文字和非文字有什么区别,除了非文字进入堆的事实?

我对文字和非文字之间的区别感到困惑(那些在堆上的,我不知道它们被称为什么).例如,String类型为例:

我们已经看过字符串文字,其中字符串值被硬编码到我们的程序中.字符串文字很方便,但它们并不总是适合您想要使用文本的每种情况.一个原因是它们是不可改变的....

我不明白上面的内容,因为我们已经看到了这样一个例子:

let mut a = "a"; // this is String literal here, so sitting on the stack
a = "b";
println!("a is being changed to...{}", a); // this is the same String literal sitting on the stack?
Run Code Online (Sandbox Code Playgroud)

显然,文字在Rust中是可变的.两者之间有什么区别,除了文字进入堆栈这一事实,而非文字进入堆?

我试图理解为什么我不应该在我的代码中使用可变文字,考虑到堆栈比堆快.

// a is mutable literal
let mut a = "a";
a = "b";
// b is mutable 'non-literal'
let mut b = String::from("a");
b = String::from("b");
Run Code Online (Sandbox Code Playgroud)

types memory-management rust

0
推荐指数
1
解决办法
249
查看次数

从 C++ 调用 Rust 时如何通过引用传递参数?

我正在尝试进行一个非常简单的测试,以了解如何从 C/C++ 调用 Rust 函数。

我的 C++ 代码:

#include <iostream>
#include <cstdint>

extern "C" {

int32_t add_one(int32_t x);

} // extern "C"

using namespace std;

int main() {
    int32_t x = 14;
    cout << x << endl;
    cout << add_one(x) << endl;
    cout << x << endl;
}
Run Code Online (Sandbox Code Playgroud)

我的锈代码:

#[no_mangle]
pub extern "C" fn add_one(x: i32) -> i32 {
    x + 1
}
Run Code Online (Sandbox Code Playgroud)

编译到一个库,这给出了一个.dll和一个.d文件来编译:

g++ main.c libc_rust.a -o output.exe
Run Code Online (Sandbox Code Playgroud)

正如我所料,这给了我14 15 14.

如何让我的 Rust …

c++ rust

0
推荐指数
1
解决办法
202
查看次数