我不確定何時使用&mut self
而不僅僅是&self
在libzmq C API的Rust綁定中。有點背景:libzmq提供了socket的「對象」,它有一個類似於BSD套接字API的API,並用C中的不透明指針表示。這個指針實際上只是一個句柄,類似於POSIX文件描述符,並且C API被設計爲使得它可能是而不是以獲得對該指針後面的存儲器的任何引用。什麼時候應該在C庫的Rust綁定中使用`&mut self`與`&self`?
在這些情況下,它是安全和良好的API設計公開套接字方法與不可變的self
?作爲一個具體的例子,考慮zmq_send()
:
int zmq_send (void *socket, void *buf, size_t len, int flags);
我認爲它可以(也應該)使用一成不變的自我暴露,即:
pub fn send(&self, data: &[u8], flags: i32) -> Result<()> { ... }
然而,可比的防鏽標準庫的方法使用&mut self
,例如std::io::Write::write()
,如由std::net::TcpStream
執行。另一方面,std::net::UdpStream::write()
只需要&self
。我的猜測是使用&mut self
僅僅是因爲它是Write
特徵的實現,反過來(我猜)使用&mut self
來限制特徵的實現。
我希望有人可以在這裏備份或反駁我的猜測 - 我在本書或Nomicon中找不到有關該主題的任何具體內容。
相關:[爲什麼可以實現Read對File的不可變引用?](http://stackoverflow.com/q/31503488/155423)。在這種情況下,操作系統處理底層文件描述符的多次使用,所以沒有理由在Rust中執行該操作。 – Shepmaster