< 返回版块

php-lsys 发表于 2021-09-15 23:33

根据字符串字段名得到结构体中的字段值

struct A{
    a:i32,
    b:u64
}

macro_rules! get{
    ($var:expr,$field:expr)=>{
        //如何实现返回指定字段??
    }
}

fn main() {
    let a=A{a:1,b:2};
    let f=get!(a,"a");//期望得到1

}

评论区

写评论
timongh 2021-09-23 02:57

假如你能通过字符串动态获取字段,那返回值的类型怎么写?

有两个方案:1.写一个enum包含所有可能的类型;2.使用Trait对象。

不管用哪个方案,使用HashMap,都能满足你动态获取的需求。

或者你有非用struct不可的理由吗?说说看

作者 php-lsys 2021-09-16 23:11

我在弄一个类似结构体之间的拷贝 例如

struct a{ a:i32, b:i32 } 
struct b{ a:i32 } 

实现一个方法或宏,把a传进去,如果存在同名字段就把值赋值过去。

捞出字段来可以,但对比完赋值的时候,没法在对应上了

--
👇
madolchepalooza: 宏也是编译期的功能,肯定没法干了,非要说的话就手动打表呗

都用Rust建议还是别惦记那些个运行时特性了

--
👇
php-lsys: 字符串,运行时才知道.

--
👇
苦瓜小仔: 直接 a.a 就行了啊,当然 前提是同一模块下才能这么用;如果跨模块取结构体字段的值,要么 pub 字段,要么写一个 getter 方法。

madolchepalooza 2021-09-16 21:38

宏也是编译期的功能,肯定没法干了,非要说的话就手动打表呗

都用Rust建议还是别惦记那些个运行时特性了

--
👇
php-lsys: 字符串,运行时才知道.

--
👇
苦瓜小仔: 直接 a.a 就行了啊,当然 前提是同一模块下才能这么用;如果跨模块取结构体字段的值,要么 pub 字段,要么写一个 getter 方法。

作者 php-lsys 2021-09-16 11:05

字符串,运行时才知道.

--
👇
苦瓜小仔: 直接 a.a 就行了啊,当然 前提是同一模块下才能这么用;如果跨模块取结构体字段的值,要么 pub 字段,要么写一个 getter 方法。

作者 php-lsys 2021-09-16 10:15

字符串"a" 不是ident

--
👇
nujz:

macro_rules! get {
    ($var:expr, $field:ident) => {
        $var.$field
    };
}
苦瓜小仔 2021-09-15 23:59

直接 a.a 就行了啊,当然 前提是同一模块下才能这么用;如果跨模块取结构体字段的值,要么 pub 字段,要么写一个 getter 方法。

nujz 2021-09-15 23:57
let f = get!(a, a);
nujz 2021-09-15 23:56
macro_rules! get {
    ($var:expr, $field:ident) => {
        $var.$field
    };
}
1 共 8 条评论, 1 页