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"]);
}