LED 드라이버가 녹이기 위해 C 테스트 코드 일부를 다시 작성하고 있습니다.assert_eq로 변경 가능하고 변경 불가능한 차용 문제가 발생했습니다.
struct LEDDriver<'a> {
address: &'a mut u32,
}
impl<'a> LEDDriver<'a> {
fn new(address: &'a mut u32) -> Self {
let leddriver = LEDDriver { address: address };
*leddriver.address = 0;
leddriver
}
}
fn driver_init_leds_off() {
let ref mut addr = 0xffffffff;
let leddriver = LEDDriver::new(addr);
assert_eq!(0, *addr);
}
당신은 here
문제는 불변으로 심판을 요구하는 어설 션 문에있는 예제를 실행 할 수 있습니다,하지만 난 요지를 지우려면 LEDDriver에 피 시험 메모리 심판을 전달합니다. 이 최소화 된 예이기 때문에이 실제 사용 사례에 일치하는 경우
'leddriver' 바인딩 위에'assert_eq'을 넣으면 작동 할 것입니다. – ljedrz
나는 모순을 보았다. 변경 가능한 소유권에 대한 참조와 그것을 읽을 때를 전달한다. 이것은 Rust에서 분명히 금지되어 있습니다. 이미 변경 가능한 항목이 있으면 참조 할 수 없습니다. 이것은 빌려주는 법의 규칙입니다. 그러나 스마트 포인터 또는'Rc '를 사용하여 해결할 수 있습니다. –
_ "문제는 ref를 불변으로해야하는 assert 문과 관련이 있습니다. [...]"실제 문제는 이미 'LEDDriver' 인스턴스에 전달 된 변경 가능한 참조를 사용하려고 시도하여 결과적으로 두 개의 변경 가능한 참조는 불법입니다. [참고 및 차용]에 대한 책을 두 번째 읽으라고 권합니다 (https://doc.rust-lang.org/book/secondedition/ch04-02-references-and-borrowing.html). –