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 }
假如你能通过字符串动态获取字段,那返回值的类型怎么写?
有两个方案:1.写一个enum包含所有可能的类型;2.使用Trait对象。
不管用哪个方案,使用HashMap,都能满足你动态获取的需求。
或者你有非用struct不可的理由吗?说说看
我在弄一个类似结构体之间的拷贝 例如
struct a{ a:i32, b:i32 } struct b{ a:i32 }
实现一个方法或宏,把a传进去,如果存在同名字段就把值赋值过去。
捞出字段来可以,但对比完赋值的时候,没法在对应上了
-- 👇 madolchepalooza: 宏也是编译期的功能,肯定没法干了,非要说的话就手动打表呗
都用Rust建议还是别惦记那些个运行时特性了
-- 👇 php-lsys: 字符串,运行时才知道.
-- 👇 苦瓜小仔: 直接 a.a 就行了啊,当然 前提是同一模块下才能这么用;如果跨模块取结构体字段的值,要么 pub 字段,要么写一个 getter 方法。
a.a
宏也是编译期的功能,肯定没法干了,非要说的话就手动打表呗
字符串,运行时才知道.
字符串"a" 不是ident
-- 👇 nujz:
macro_rules! get { ($var:expr, $field:ident) => { $var.$field }; }
直接 a.a 就行了啊,当然 前提是同一模块下才能这么用;如果跨模块取结构体字段的值,要么 pub 字段,要么写一个 getter 方法。
let f = get!(a, a);
评论区
写评论假如你能通过字符串动态获取字段,那返回值的类型怎么写?
有两个方案:1.写一个enum包含所有可能的类型;2.使用Trait对象。
不管用哪个方案,使用HashMap,都能满足你动态获取的需求。
或者你有非用struct不可的理由吗?说说看
我在弄一个类似结构体之间的拷贝 例如
实现一个方法或宏,把a传进去,如果存在同名字段就把值赋值过去。
捞出字段来可以,但对比完赋值的时候,没法在对应上了
--
👇
madolchepalooza: 宏也是编译期的功能,肯定没法干了,非要说的话就手动打表呗
都用Rust建议还是别惦记那些个运行时特性了
--
👇
php-lsys: 字符串,运行时才知道.
--
👇
苦瓜小仔: 直接
a.a
就行了啊,当然 前提是同一模块下才能这么用;如果跨模块取结构体字段的值,要么 pub 字段,要么写一个 getter 方法。宏也是编译期的功能,肯定没法干了,非要说的话就手动打表呗
都用Rust建议还是别惦记那些个运行时特性了
--
👇
php-lsys: 字符串,运行时才知道.
--
👇
苦瓜小仔: 直接
a.a
就行了啊,当然 前提是同一模块下才能这么用;如果跨模块取结构体字段的值,要么 pub 字段,要么写一个 getter 方法。字符串,运行时才知道.
--
👇
苦瓜小仔: 直接
a.a
就行了啊,当然 前提是同一模块下才能这么用;如果跨模块取结构体字段的值,要么 pub 字段,要么写一个 getter 方法。字符串"a" 不是ident
--
👇
nujz:
直接
a.a
就行了啊,当然 前提是同一模块下才能这么用;如果跨模块取结构体字段的值,要么 pub 字段,要么写一个 getter 方法。