学習目的で、私は現在、特定のポート セット (10000-60000 など) で動作する UDP パケット用のエコー サーバーを実装する小さなプログラムを作成しようとしています。このために 50k スレッドをスパムするのはあまり良くないので、非同期 IO を使用する必要があり、mio はこのタスクに最適です。しかし、私はこのコードで最初から問題を抱えています:
extern crate mio;
extern crate bytes;
use mio::udp::*;
use bytes::MutSliceBuf;
fn main() {
let addr = "127.0.0.1:10000".parse().unwrap();
let socket = UdpSocket::bound(&addr).unwrap();
let mut buf = [0; 128];
socket.recv_from(&mut MutSliceBuf::wrap(&mut buf));
}
これは、mio の test_udp_socket.rs からのほぼ完全なコピーペーストです。しかし、mio のテストは正常にパススルーされますが、このコードをコンパイルしようとすると、次のエラーが発生します。
src/main.rs:12:12: 12:55 error: the trait `bytes::buf::MutBuf` is not implemented for the type `bytes::buf::slice::MutSliceBuf<'_>` [E0277]
src/main.rs:12 socket.recv_from(&mut MutSliceBuf::wrap(&mut buf));
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src/main.rs:12:12: 12:55 help: run `rustc --explain E0277` to see a detailed explanation
しかし、bytes クレートの src/buf/slice.rs のコード (ローカル コピーも) を調べると、このトレイトが実装されていることがはっきりとわかります。
impl<'a> MutBuf for MutSliceBuf<'a> {
fn remaining(&self) -> usize {
self.bytes.len() - self.pos
}
fn advance(&mut self, mut cnt: usize) {
cnt = cmp::min(cnt, self.remaining());
self.pos += cnt;
}
unsafe fn mut_bytes<'b>(&'b mut self) -> &'b mut [u8] {
&mut self.bytes[self.pos..]
}
}
それはおそらく些細なことですが、私はそれを見つけることができません... このエラーを引き起こす問題は何ですか?
私はrustc 1.3.0(9a92aaf19 2015-09-15)を使用しています.mioをクレートし、バイトはgithubから直接取得します。