2017-11-11 2 views
0

나는 boolean의 벡터로 숫자를 표현함으로써 2 진수로 산술 연산을 다시 생성합니다.변수가 변수로 선언 된 경우에도 불변이라고합니다.

fn match_lengths(mut bit_vec0: Vec<bool>, mut bit_vec1: Vec<bool>) -> (Vec<bool>, Vec<bool>) { 
    { 
     let (mut shorter, longer) = if bit_vec0.len() < bit_vec1.len() { 
      (&bit_vec0, &bit_vec1) 
     } else { 
      (&bit_vec1, &bit_vec0) 
     }; 
     let bit_sign = match shorter.last() { 
      Some(content) => *content, 
      None => false, 
     }; 

     for _ in shorter.len()..longer.len() { 
      shorter.push(bit_sign); 
     } 
    } 

    (bit_vec0, bit_vec1) 
} 

내가 오류를 내가 mut 지정자로 선언에도 불구하고

error[E0596]: cannot borrow immutable borrowed content `*shorter` as mutable 
    --> src/main.rs:15:13 
    | 
15 |    shorter.push(bit_sign); // Error here 
    |    ^^^^^^^ cannot borrow as mutable 

를 얻을 : 각 벡터의 크기가 다를 수 있기 때문에, 나는 각 벡터의 길이와 일치하는 기능을했다.

+0

다음에 오류가 발생하면 자주 사용하는 검색 엔진을 사용하여 오류 텍스트를 검색하는 것이 좋습니다. 여러 번, 기존 Stack Overflow 질문이 최고의 결과가 될 것입니다 (특히 검색을이 도메인으로 제한하는 경우). – Shepmaster

답변

2

shorter의 종류는 1 돌연변이 허용되지 않는 Vec<bool> 지칭 수단보다 정밀 &Vec<bool>참조,이다.

mut shorter으로 변수를 선언하면 shorter 변수 만 변경할 수있어 예를 들어 shorter = ... 지정을 사용하여 다른 Vec<bool>을 참조하도록 지정하십시오. 변수의 가변성과 관계없이 유형이 &Vec<bool> 인 공유 참조가 참조하는 객체를 변경하는 것이 허용되지 않습니다.

&mut bit_vec1을 사용하여 &mut Vec<bool> 유형의 변경 가능한 참조를 작성해야합니다. 이 변경으로 인해 코드가 컴파일되고 그 시점에서 shorter은 더 이상 mut 일 필요가 없습니다.

마지막으로, 이것은 match_lengths이 값에 따라 bit_vec0bit_vec1을 받아들이고 수정 한 다음 반환한다는 질문과 관련이 없습니다. 그것은 확실히 작동하지만 변경 가능한 참조를 받아들이는 것은 더 관용적입니다. 이러한 접근 방식은 호출자에게보다 인간 공학적이며, 실제로 함수가 실제로 "반환"하지 않는다는 사실을보다 분명하게 알려주며, 실제로 기존 객체를 수정합니다. 그 수정을

는 기능은 다음과 같습니다뿐만 아니라 공유입니다 :

fn match_lengths(bit_vec0: &mut Vec<bool>, bit_vec1: &mut Vec<bool>) { 
    let (shorter, longer) = if bit_vec0.len() < bit_vec1.len() { 
     (bit_vec0, bit_vec1) 
    } else { 
     (bit_vec1, bit_vec0) 
    }; 
    let bit_sign = match shorter.last() { 
     Some(content) => *content, 
     None => false, 
    }; 
    for _ in shorter.len()..longer.len() { 
     shorter.push(bit_sign); 
    } 
} 

1 이 많은 C++의 const하지만, 녹에서 보장 const의 것보다 훨씬 강하다는 같은 소리 (non-mut) 참조가 참조하는 객체를 변경하는 것이 허용되지 않았지만 다른 누구도 참조 할 수 없습니다! Rust의 컴파일러와 런타임은 객체에 대한 참조가 존재하는 동안 객체에 대한 참조 생성을 막습니다.

관련 문제