小编cry*_*nic的帖子

Rust 将指向结构体第一个成员的指针转换为指向该结构体的指针是否合法?

在 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)

undefined-behavior language-lawyer rust

12
推荐指数
1
解决办法
2282
查看次数

带有构造函数的 C++ 枚举类

在 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++ 枚举类做类似的事情吗?

c++ enums

3
推荐指数
1
解决办法
460
查看次数

如何使用 Arc 和 BufReader 编写自引用 Rust 结构?

我正在尝试为服务器编写以下代码:

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,只要用户还活着,它就不会被删除)。如何让编译器接受这段代码?

self-reference rust

3
推荐指数
1
解决办法
4512
查看次数

使用serde,如何在反序列化时保留序列化数据的副本?

我正在使用 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)

评论里可以填什么内容???

rust serde

1
推荐指数
1
解决办法
706
查看次数