0

古いプロジェクトを Rust に移植していますが、解決策が見つからない問題に直面しました。私が見つけた唯一の同様のものはthisで、実際の質問には答えません。根本的な問題は次のとおりです。

struct A {
    a: Box<i32>,
    b: Box<i32>
}

impl A {
    fn get_a(&mut self) -> &mut Box<i32> { &mut self.a }
    fn get_b(&mut self) -> &mut Box<i32> { &mut self.b }
}

fn main() {
    let mut a = A{ a: Box::new(42), b: Box::new(28) };

    // This compiles:
    //let af = &mut a.a;
    //let bf = &mut a.b;

    // This doesn't!
    let af = a.get_a();
    let bf = a.get_b();

    println!("{}", af);
    println!("{}", bf);
}

私の実際のコードでは、これがあります:

struct GlyphPlacer {
    bitmap: Bitmap,
    bitmaps: Vec<(char, GlyphBitmap)>,

    current_scanline_buffer: usize,
    scanline_buffers: [Vec<Scanline>; 2]
}

impl GlyphPlacer {
    // ...

    fn immutable_scanline_buffer(&self) -> &Vec<Scanline> {
        &self.scanline_buffers[self.current_scanline_buffer]
    }

    fn draw_scanlines(&mut self) {
        for scanline in self.immutable_scanline_buffer() {
            // error: cannot borrow `self.bitmap` as mutable because `*self` is also borrowed as immutable [E0502]
            self.bitmap.draw_scanline(*scanline);
        }
    }
}

メソッドの実装をインライン化した場合にのみコンパイルされ、メソッドが実際の構造体ではなくフィールドのメソッドであるimmutable_scanline_buffer()ためにのみコンパイルされます。draw_scanline()self.bitmapGlyphPlacer

fn draw_scanlines(&mut self) {
    for scanline in &self.scanline_buffers[self.current_scanline_buffer] {
        self.bitmap.draw_scanline(*scanline);
    }
}

原因はわかりましたが、このような場合はどのように対処すればよいのでしょうか? これらの 2 つのフィールドは の実装の一部にすぎないため、分離できませんGlyphPlacer。また、そのようなコードを常にコピー アンド ペーストできるとimmutable_scanline_buffer()は限りません。

4

0 に答える 0