Rust 有没有办法对结构实例执行索引访问?

Rust 有没有办法对结构实例执行索引访问?,rust,Rust,有没有一种方法可以对结构实例执行索引访问,如下所示: struct MyStruct { // ... } impl MyStruct { // ... } fn main() { let s = MyStruct::new(); s["something"] = 533; // This is what I need } 您要使用(及其对): 使用std::ops::Index; #[衍生(复制、克隆)] 结构Foo; 结构杆; Foo的impl索

有没有一种方法可以对结构实例执行索引访问,如下所示:

struct MyStruct {
    // ...
}

impl MyStruct {
    // ...    
}

fn main() {
    let s = MyStruct::new();
    s["something"] = 533; // This is what I need
}
您要使用(及其对):

使用std::ops::Index;
#[衍生(复制、克隆)]
结构Foo;
结构杆;
Foo的impl索引{
类型输出=Foo;
fn索引和a Foo{
println!(“索引!”);
自己
}
}
fn main(){
富[巴];
}
您可以使用和特征


这是文档中的复制粘贴,它与我的问题有什么关系?我的意思是,在索引类型是字符串的情况下,我如何采用它?它确实是复制粘贴;为什么我要重写一个完全可用的示例,而Rust文档已经提供了它?我在这里复制了它,以防链接随着时间的推移而中断。如果您无法将文档中的示例转换为您的具体案例,那么您应该链接到原始问题中的文档,并询问有关您遇到问题的零件的特定问题。您想说服我什么?我必须同时使用它们吗?如果您想要两种操作,是的,这只是一个例子;没有理由认为使用索引检索的值必须是结构的字段。例如,
HashMap
支持使用任何键类型进行索引,包括
&str
,比如
map:HashMap
let value:u32=map[“foo”]
@dbaupp只是使用
HashMap
作为实现
索引(Mut)
特征的另一种方式的示例。您唯一的要求是返回对类型
Index::Output
的(可变)引用。如何实现这一逻辑完全取决于您。您最初的示例有点稀疏,所以我们只是猜测您可能会发现有用的东西。@AlexanderSupertramp,我完全理解您提出的问题(注意,您实际提出的问题不一定是您想要提出的:),并给出了使用这些特征的工作示例。您只需要更改结构的内容和实现的内容以适应您的用例
HashMap
只是在
std
中定义的一个自定义结构,它实现了这些特性,没有任何特殊之处,因此这只是使用这些特性来获得
[]
符号的另一个例子。如果您解释您想要
s[“something”]=533
做什么,回答者可能会给出更多具体的例子。否则,我们只能向您展示您需要实现的语法和特性。@Shepmaster,您不明白
s[“something”]=533
的功能是什么?没有足够的上下文来真正确定您想要什么。它有可能做Rust能做的任何事情(编写文件、通过网络发送数据、
panic
ing等等),只要它最终返回一个整数变量的可变引用(不清楚您是否想要16、32或64位的值,但这只是迂腐)。
use std::ops::{Index, IndexMut};

struct Foo {
    x: i32,
    y: i32,
}

impl Index<&'_ str> for Foo {
    type Output = i32;
    fn index(&self, s: &str) -> &i32 {
        match s {
            "x" => &self.x,
            "y" => &self.y,
            _ => panic!("unknown field: {}", s),
        }
    }
}

impl IndexMut<&'_ str> for Foo {
    fn index_mut(&mut self, s: &str) -> &mut i32 {
        match s {
            "x" => &mut self.x,
            "y" => &mut self.y,
            _ => panic!("unknown field: {}", s),
        }
    }
}

fn main() {
    let mut foo = Foo { x: 0, y: 0 };

    foo["y"] += 2;
    println!("x: {}", foo["x"]);
    println!("y: {}", foo["y"]);
}