Sau đây là mô phỏng đơn giản với trường là khu vực hình chữ nhật có hai quả bóng nảy xung quanh trong đó. Cấu trúc Field
có phương thức update
, gọi là update
trên mỗi quả bóng. Các quả bóng, theo phương pháp update
của chúng, cần di chuyển xung quanh dựa trên vận tốc của chúng. Nhưng họ cũng cần phải phản ứng với nhau, cũng như ranh giới của lĩnh vực công trình .:Truyền tham chiếu tự biến đổi được tới phương thức của đối tượng sở hữu
fn main() {
let mut field = Field::new(Vector2d { x: 100, y: 100 });
field.update();
}
#[derive(Copy, Clone)]
struct Vector2d {
x: i32,
y: i32,
}
struct Ball {
radius: i32,
position: Vector2d,
velocity: Vector2d,
}
impl Ball {
fn new(radius: i32, position: Vector2d, velocity: Vector2d) -> Ball {
Ball {
radius: radius,
position: position,
velocity: velocity,
}
}
fn update(&mut self, field: &Field) {
// check collisions with walls
// and other objects
}
}
struct Field {
size: Vector2d,
balls: [Ball; 2],
}
impl Field {
fn new(size: Vector2d) -> Field {
let position_1 = Vector2d {
x: size.x/3,
y: size.y/3,
};
let velocity_1 = Vector2d { x: 1, y: 1 };
let position_2 = Vector2d {
x: size.x * 2/3,
y: size.y * 2/3,
};
let velocity_2 = Vector2d { x: -1, y: -1 };
let ball_1 = Ball::new(1, position_1, velocity_1);
let ball_2 = Ball::new(1, position_2, velocity_2);
Field {
size: size,
balls: [ball_1, ball_2],
}
}
fn update(&mut self) {
// this does not compile
self.balls[0].update(self);
self.balls[1].update(self);
}
}
Làm thế nào để tôi nhận được thông tin về ranh giới và bóng khác để chức năng cập nhật các Ball
struct không? Những dòng trong Field::update
không biên dịch:
self.balls[0].update(self);
self.balls[1].update(self);
Cho các lỗi sau:
error[E0502]: cannot borrow `*self` as immutable because `self.balls[..]` is also borrowed as mutable
--> src/main.rs:62:30
|
62 | self.balls[0].update(self);
| ------------- ^^^^- mutable borrow ends here
| | |
| | immutable borrow occurs here
| mutable borrow occurs here
mà tôi hiểu, nhưng tôi không biết làm thế nào để làm được việc này.
Yeah, mà sẽ làm việc . Man, Rust thực sự khiến tôi suy nghĩ khác về cách tôi lập trình. –