【发布时间】:2016-11-18 15:12:16
【问题描述】:
我不确定何时在 libzmq C API 的 Rust 绑定中使用 &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);
我认为它可以(并且应该)使用不可变的自我来公开,即:
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 中找不到关于该主题的任何具体内容。
【问题讨论】:
-
相关:Why is it possible to implement Read on an immutable reference to File?。在这种情况下,操作系统会处理底层文件描述符的多次使用,因此没有理由在 Rust 中强制执行。