2017-11-21 3 views
1

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에 피 시험 메모리 심판을 전달합니다. 이 최소화 된 예이기 때문에이 실제 사용 사례에 일치하는 경우

+0

'leddriver' 바인딩 위에'assert_eq'을 넣으면 작동 할 것입니다. – ljedrz

+0

나는 모순을 보았다. 변경 가능한 소유권에 대한 참조와 그것을 읽을 때를 전달한다. 이것은 Rust에서 분명히 금지되어 있습니다. 이미 변경 가능한 항목이 있으면 참조 할 수 없습니다. 이것은 빌려주는 법의 규칙입니다. 그러나 스마트 포인터 또는'Rc '를 사용하여 해결할 수 있습니다. –

+0

_ "문제는 ref를 불변으로해야하는 assert 문과 관련이 있습니다. [...]"실제 문제는 이미 'LEDDriver' 인스턴스에 전달 된 변경 가능한 참조를 사용하려고 시도하여 결과적으로 두 개의 변경 가능한 참조는 불법입니다. [참고 및 차용]에 대한 책을 두 번째 읽으라고 권합니다 (https://doc.rust-lang.org/book/secondedition/ch04-02-references-and-borrowing.html). –

답변

2

는 잘 모르겠지만,이 빌린 후 leddriver 그것을 빌리는 사람이기 때문에 당신은 단지 (데이터에 액세스하는 대신 *addr*leddriver.address을 사용할 수 있습니다)


또한 어떤 메모리 또는 런타임 오버 헤드가 발생하지만, 내부 값에 대한 참조를 방지하지 않습니다 Cell를 사용할 수 있습니다. 그렇지 않으면 녹이 같은 결과를 얻을 것 사이에 addr.set()없이 그 여러 addr.get()을 가정하는 것이 허용되기 때문에

use std::cell::Cell; 

struct LEDDriver<'a> { 
    address: &'a Cell<u32>, 
} 

impl<'a> LEDDriver<'a> { 
    fn new(address: &'a Cell<u32>) -> Self { 
     let leddriver = LEDDriver { address: address }; 
     leddriver.address.set(0); 
     leddriver 
    } 
} 

fn driver_init_leds_off() { 
    let ref mut addr = Cell::new(0xffffffff); 
    let leddriver = LEDDriver::new(addr); 

    assert_eq!(0, addr.get()); 
} 

addr의 메모리 위치가 인터럽트의 하드웨어에 전달 또는 수정 될 경우에 당신은,하지만 Volatile를 사용한다 하드웨어 나 인터럽트가 변경되었을지라도

+0

'휘발성 '- [휘발성] (https://crates.io/crates/volatile) 상자의 것입니까? – trentcl

+0

그 중 하나입니다. –

관련 문제