gpt4 book ai didi

rust - 我什么时候应该在 C 库的 Rust 绑定(bind)中使用 `&mut self` 与 `&self`?

转载 作者:行者123 更新时间:2023-11-29 07:58:09 25 4
gpt4 key购买 nike

我不确定何时在 libzmq C API 的 Rust 绑定(bind)中使用 &mut self 与仅使用 &self

一些背景知识:libzmq 提供套接字“对象”,它有一个类似于 BSD 套接字 API 的 API,在 C 中由一个不透明的指针表示。这个指针实际上只是一个句柄,类似于 POSIX 文件描述符,并且 C API 的设计使其不可能获得对该指针后面的内存的任何引用。

在这种情况下,使用不可变的self 公开套接字方法是否安全且良好的API 设计?作为一个具体的例子,请考虑 zmq_send() :

int zmq_send (void *socket, void *buf, size_t len, int flags);

我认为它可以(并且应该)使用不可变的 self 来公开,即:

pub fn send(&self, data: &[u8], flags: i32) -> Result<()> { ... }

但是,可比较的 Rust 标准库方法使用 &mut self,例如std::io::Write::write() ,由 std::net::TcpStream 实现。另一方面,std::net::UdpStream::write() 只需要 &self。我的猜测是 &mut self 被使用只是因为它是 Write 特性的实现,而后者(我猜)又使用 &mut self不限制特征的实现。

我希望有人能在这里支持或反驳我的推测——我在本书或 Nomicon 中找不到关于该主题的任何具体内容。

最佳答案

在这种情况下,对象是否发生变异是次要的;主要问题是“同时使用两个引用是否安全?”。两个线程可以同时在同一个对象上调用 zmq_send(或其他方法),或者(如果 API 允许)通过嵌套回调等调用吗?

如果不是,请使用 &mut self 并让 Rust 执行您需要的安全保证。

如果安全,那么&self可能是合适的,如果zmq保证没问题;这就像 Mutex::lock 接受 &self

关于rust - 我什么时候应该在 C 库的 Rust 绑定(bind)中使用 `&mut self` 与 `&self`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40680417/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com