2017-03-08 17 views
-1

소유권 시스템을 이해하려고합니다. 이를 테스트하려면, 내가 Vec을 차용하는 기능을하고 싶었에 값을 추가하고 그 값 반환 값 : =::에 변경기능, 변경 가능한 차용

error: expected `::`, found `=` 
--> src/main.rs:8:16 
    | 
8 | let i: <i32> = test(&mut vec); 
    |    ^

error: type `()` cannot be dereferenced 
--> src/main.rs:2:5 
    | 
2 |  *v1.push(10);  
    |  ^^^^^^^^^^^^ 

:

fn test(v1: &mut Vec<i32>) -> i32 {  
    *v1.push(10);  
    v1[3] 
} 

fn main() { 
    let mut vec: Vec<i32> = vec![10, 20, 30]; 
    let i: <i32> = test(&mut vec); 
} 

나는이 두 가지 오류가 발생할 수를 도울 수 없으며 왜 그렇게 될지 이해하지 못합니다.

답변

0

모든 유형을 <>으로 묶어서는 안됩니다. <>은 일반 매개 변수를 지정하려는 것을 의미합니다. 이것으로 충분합니다 :

let i: i32 = /* value */; 

무엇보다 형식을 지정할 필요가 없습니다. 컴파일러는 형식을 유추합니다. 다음과 같이 쓸 수 있습니다 :

let mut vec = vec![10, 20, 30]; 

let i = test(&mut vec); 

두 번째 문제가 해결됩니다.

첫 번째 오류는 참조가 아닌 ()의 참조를 취소하려는 것이기 때문에 발생합니다. 당신은 (C++ 및 방법) 당신이 구조의 필드에 액세스 할 수 있습니다

  • ->을 구조 필드에 액세스 할 수 있습니다

    • . :

      C에서

      (및 C++) 우리는 2 개의 다른 액세스 연산자를 포인터 뒤에

    녹슬어 버리면 이러한 세부 정보가 표시되지 않으므로 . 연산자 만 사용해야합니다.

    Vec::<T>::push(&mut vec, val: T) 유형은 () (단위 유형)을 반환한다는 것을 의미합니다. 문제를 해결하려면 *을 제거하십시오.

    fn test(v1: &mut Vec<i32>) -> i32 { 
        v1.push(10); 
    
        v1[3] 
    } 
    
    fn main() { 
        let mut vec = vec![10, 20, 30]; 
        let i = test(&mut vec); 
    } 
    
  • +0

    답장을 보내 주셔서 감사합니다. 이제 작동합니다. 나는 참고 문헌의 내용에 * 접속할 필요가 있다고 생각했다. –

    +1

    먼저 불필요한 데레 인용은 계속 작동해야합니다. 대괄호를 사용해야하기 때문에'(* v1) .push (10)'이 아닌'* (v1.push (10)) '로 구문 분석됩니다. 이것은 C와 동일한 연산자 우선 순위입니다. – trentcl