Rust 如何设置现有结构的值?

Rust 如何设置现有结构的值?,rust,Rust,考虑以下几点: use rand::{thread_rng, Rng}; struct Character { name: String, hp: i32, level: i32, xp: i32, gold: i32 } impl Character { fn new(name: String) -> Character { let mut rng = thread_rng(); let hp: i32

考虑以下几点:

use rand::{thread_rng, Rng};

struct Character {
    name: String,
    hp: i32,
    level: i32,
    xp: i32,
    gold: i32
}

impl Character {
    fn new(name: String) -> Character {
        let mut rng = thread_rng();

        let hp: i32 = rng.gen_range(12, 75);
        let gold: i32 = rng.gen_range(10, 50);

        Character { name: name, hp: hp, level: 1, xp: 0, gold: gold }
    }

    fn set_hp(&self, hp: &i32) {
        &self.hp = hp;
    }

    fn get_hp(&self) -> i32 {
        self.hp
    }
}
这将生成以下错误:

错误[E0070]:左侧表达式无效
-->src/game/character/character.rs:22:9
|
22 |&self.hp=hp;
|^^^^^^^^^^^^^^^表达式的左侧无效

为什么我不能将
字符.hp
设置为传入的值?这个左手的表达是什么?我在文档中找不到这方面的任何信息。

语法
&foo=bar
没有意义。如果它起作用,它将意味着:

  • 参考
    foo
  • 将引用(指针)替换为
    bar
    的值
  • 你想要的是

    fn set_hp(&mut self, hp: &i32) {
        self.hp = *hp;
    }
    
    这将取消对传入参数的引用,并将其存储在
    self.hp
    中。请注意,
    self
    参数必须是可变的才能更改值

    这个左手的表达是什么


    通常缩写为LHS,它位于赋值操作的左侧。有些东西是可以分配的。例如,
    5=6
    也将是无效的LHS。

    语法
    &foo=bar
    没有意义。如果它起作用,它将意味着:

  • 参考
    foo
  • 将引用(指针)替换为
    bar
    的值
  • 你想要的是

    fn set_hp(&mut self, hp: &i32) {
        self.hp = *hp;
    }
    
    这将取消对传入参数的引用,并将其存储在
    self.hp
    中。请注意,
    self
    参数必须是可变的才能更改值

    这个左手的表达是什么


    通常缩写为LHS,它位于赋值操作的左侧。有些东西是可以分配的。例如,
    5=6
    也将是无效的LHS。

    &self.hp=hp
    正在尝试分配给引用,这显然不是一个好主意
    self.hp=hp
    (取而代之的是
    &mut self
    ,因为您正在变异
    self
    )。
    &self.hp=hp
    正在尝试分配一个引用,这显然不是一个好主意
    self.hp=hp
    (取而代之的是
    &mut self
    ,因为您正在变异
    self
    )。注意:通常,
    Copy
    -像
    i32
    这样的类型不是通过不可变引用传递的,而是通过值传递的。注意:通常,
    Copy
    -像
    i32
    这样的类型不是通过不可变引用传递的,而是通过值传递的。