1

学習目的で、私は現在、特定のポート セット (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から直接取得します。

4

1 に答える 1