我有一个自定义结构,如下所示:
struct MyStruct {
first_field: i32,
second_field: String,
third_field: u16,
}
Run Code Online (Sandbox Code Playgroud)
是否有可能以编程方式获取结构字段的数量(例如,通过方法调用field_count()):
let my_struct = MyStruct::new(10, "second_field", 4);
let field_count = my_struct.field_count(); // Expecting to get 3
Run Code Online (Sandbox Code Playgroud)
对于这个结构:
struct MyStruct2 {
first_field: i32,
}
Run Code Online (Sandbox Code Playgroud)
......以下电话应该返回1:
let my_struct_2 = MyStruct2::new(7);
let field_count = my_struct2.field_count(); // Expecting to get count 1
Run Code Online (Sandbox Code Playgroud)
有没有像这样的API field_count()或者只能通过宏获得它?
如果使用宏可以实现这一点,那么应该如何实现?
我想知道是否有办法在宏中获取结构的字段名称.请考虑以下示例:
struct S {
a: String,
b: String,
}
Run Code Online (Sandbox Code Playgroud)
和宏__CODE__,这样称为:
my_macro!(S);
Run Code Online (Sandbox Code Playgroud)
现在我想访问结构的字段名称,不知何故这样:
macro_rules! my_macro {
($t:ty) => {{
let field_names = get_field_names($t);
// do something with field_names
}};
}
Run Code Online (Sandbox Code Playgroud)
我是Rust和宏的新手,所以也许我错过了一些明显的东西.
A u32占用4个字节的内存,a String占用3个指针大小的整数(用于位置,大小和保留空间),在栈上加上一些内存。
在我看来,这意味着Rust在执行代码时不知道在特定位置存储什么类型,因为这种知识将需要更多的内存。
但是同时,是否不需要知道在0xfa3d2f10存储什么类型,以便能够解释该位置的字节?例如,要知道接下来的字节构成String堆上a的规范吗?
我正在尝试编写一个测试来确定是否struct A有一个属性a及其类型是i32.
pub struct A {
a: i32,
}
#[test]
pub fn test_A() {
assert!(A.hasattr("a"));
assert_is_type!(A.a, i32);
}
Run Code Online (Sandbox Code Playgroud)