为什么 struct_iterable 库不给出结构field_value?

why the struct_iterable library does not give the field_value of a struct?

提问人:mikedew 提问时间:11/18/2023 更新时间:11/18/2023 访问量:27

问:

我正在尝试在 crate.io 中使用struct_iterable库

这是我的程序:

#[derive(Iterable)]
#[derive(Debug)]
struct Database {
    name: String,
    street: String,
    zip: String, 
}

let database = Database {
       name: "John".to_string(),
        street: "x avenue".to_string(),
        zip: "68901".to_string(),
};

for (field_name, field_value) in database.iter() {
   println!("field_name is {} ", field_name);
   println!("field_value  is {:?} ", field_value);           
} 

the result are : 

field_name is name 
field_value  is Any { .. } 
field_name is street 
field_value  is Any { .. } 
field_name is zip 
field_value  is Any { .. } 

我期望读取结构数据库中加载的数据。

我错过了什么吗?

评论

0赞 cdhowie 11/18/2023
由于不约束所指对象必须实现,因此它的实现提供了上述输出。这是它能做的最好的事情。 相当有限,因为 Rust 没有反射。你到底想完成什么?可能有更好的方法。AnyDebugDebugAny
0赞 mikedew 11/18/2023
Jmb给了我答案
1赞 cdhowie 11/18/2023
是的,当所有字段都是 时,这就是答案。如果结构中有异构数据类型,则需要执行其他操作。这就是为什么我要问你的最终目标是什么。String

答:

1赞 Jmb 11/18/2023 #1

该值可以具有任何类型,并且每个字段的类型不一定相同,但必须具有单个类型,因此其类型为 。在您的例子中,由于您知道这些值都是 s,因此您可以使用以下downcast_ref获取正确类型的值:field_value&dyn AnyString

for (field_name, field_value) in database.iter() {
   println!("field_name is {} ", field_name);
   println!("field_value  is {:?} ", field_value.downcast_ref::<String>().unwrap());           
} 

评论

0赞 mikedew 11/18/2023
非常感谢,它正在工作