在 C 中,指向结构的指针可以转换为指向其第一个成员的指针,反之亦然。也就是说,结构体的地址被定义为其第一个成员的地址。
struct Base { int x; };
struct Derived { struct Base base; int y; };
int main() {
struct Derived d = { {5}, 10 };
struct Base *base = &d.base; // OK
printf("%d\n", base->x);
struct Derived *derived = (struct Derived *)base; // OK
printf("%d\n", derived->y);
}
Run Code Online (Sandbox Code Playgroud)
这通常用于实现 C++ 风格的继承。
如果结构是repr(C)(这样它们的字段就不会被重新组织),Rust 中是否允许同样的事情?
struct Base { int x; };
struct Derived { struct Base base; int y; };
int main() {
struct Derived d = { …Run Code Online (Sandbox Code Playgroud) 在 Java 中,您可以为枚举编写构造函数,例如
private MyEnum(String name, int val) {
...
}
Run Code Online (Sandbox Code Playgroud)
然后你可以写:
public enum MyEnum {
FIRST("A", 10), SECOND("B", 20), THIRD("C", 30);
private MyEnum(String name, int val) {
...
}
}
Run Code Online (Sandbox Code Playgroud)
有什么办法可以为 C++ 枚举类做类似的事情吗?
我正在尝试为服务器编写以下代码:
use std::io::{BufReader, BufWriter};
use std::net::TcpStream;
struct User<'a> {
stream: Arc<TcpStream>,
reader: BufReader<&'a TcpStream>,
writer: BufWriter<&'a TcpStream>,
}
fn accept_socket(users: &mut Vec<User>, stream: Arc<TcpStream>) {
let stream_clone = stream.clone();
let user = User {
stream: stream_clone,
reader: BufReader::new(stream_clone.as_ref()),
writer: BufWriter::new(stream_clone.as_ref()),
};
users.push(user);
}
Run Code Online (Sandbox Code Playgroud)
该流位于 Arc 后面,因为它是跨线程共享的。BufReader 和 BufWriter 指向用户自己的 Arc,但编译器抱怨该引用的寿命stream_clone.as_ref()不够长,尽管它显然是这样的(它指向 Arc,只要用户还活着,它就不会被删除)。如何让编译器接受这段代码?
我正在使用 Rust 和 Serde。假设我有一个结构体想要保留创建它的 JSON 数据的副本,也许这样它就可以在其他地方重新发送相同的 JSON,而无需重新序列化。(它并不像只保留原始 JSON 数据的副本那么简单,因为该结构可能位于更多 JSON 数据中。)示例:
#[derive(Deserialize)]
struct LargerStruct {
value: i32,
inner: InnerStruct,
}
#[derive(Deserialize)]
struct InnerStruct {
this_json: String,
inner_value: i32,
}
fn main() {
let json = r#"
{
"value": 42,
"inner": { "inner_value": 100 }
}
"#;
let val: LargerStruct = // ???
assert_eq!(&val.inner.this_json, r#"{ "inner_value": 100 }"#);
}
Run Code Online (Sandbox Code Playgroud)
评论里可以填什么内容????