निम्नलिखित एक क्षेत्र के साथ एक साधारण सिमुलेशन है जो आयताकार क्षेत्र है जिसमें दो गेंदें इसके चारों ओर उछालती हैं। Field
संरचना में update
विधि है, जो प्रत्येक गेंद पर update
पर कॉल करती है। गेंदें, update
विधि में, अपने वेग के आधार पर चारों ओर स्थानांतरित करने की आवश्यकता है। लेकिन वे भी, साथ ही क्षेत्र .:स्वामित्व वाली ऑब्जेक्ट की विधि के लिए उत्परिवर्तनीय आत्म संदर्भ पास करना
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);
}
}
की सीमाओं मैं सीमाओं और Ball
struct के अद्यतन कार्य करने के लिए अन्य गेंद के बारे में जानकारी कैसे प्राप्त करूं एक दूसरे से प्रतिक्रिया करने के लिए की जरूरत है? Field::update
में ये लाइनें संकलन नहीं:
self.balls[0].update(self);
self.balls[1].update(self);
निम्न त्रुटि देते:
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
जो मैं समझता हूँ, लेकिन मैं इस के आसपास पाने के लिए पता नहीं है।
हाँ,: आप आसानी से/सस्ते में एक
Ball
कर सकते हैं, जगह का प्रयास करें:आप आसानी से एक नहीं कर सकते हैं, तो आप एक
Option
औरtake
उपयोग कर सकते हैं । मैन, जंग वास्तव में मुझे प्रोग्राम के तरीके के बारे में अलग-अलग सोचने के लिए तैयार कर रहा है। –