2017-11-20 1 views
0

나는이 작동 46445645645564584.왜 빌리 는가 배열 액세스에서 함수 호출을 인라인하지 못하도록합니까?

use std::fmt::Debug; 

//Calculate the first 500 numbers in the Collatz sequence of 46445645645564584 

fn main() { 
    let mut v = vec![46445645645564584]; 

    for _ in 0..500 { 
     let last = v[v.len() - 1]; 
     v.push(next(last)); 
    } 

    print_array(&v); 
} 

fn next(n: i64) -> i64 { 
    if n % 2 == 0 { 
     n/2 
    } else { 
     3 * n + 1 
    } 
} 

fn print_array<T: Debug>(v: &[T]) { 
    for x in v { 
     println!("{:?}", x); 
    } 
} 

의 Collatz 시퀀스의 첫 번째 500 개 번호를 생성 녹에 몇 가지 코드를 쓰고 있어요,하지만 난 last 변수 인라인 할 :

for _ in 0..500 { 
    v.push(next(v[v.len() - 1])); 
} 

에서을 내 눈, 이것은 단순히 변수를 인라인 했으므로 프로그램의 의미를 변경해서는 안됩니다. 값 v[v.len() - 1] 계산 및 next()에 전달 될 때

error[E0502]: cannot borrow `v` as immutable because it is also borrowed as mutable 
--> src/main.rs:9:21 
    | 
9 |   v.push(next(v[v.len() - 1])); 
    |   -   ^   - mutable borrow ends here 
    |   |   | 
    |   |   immutable borrow occurs here 
    |   mutable borrow occurs here 

error[E0502]: cannot borrow `v` as immutable because it is also borrowed as mutable 
--> src/main.rs:9:23 
    | 
9 |   v.push(next(v[v.len() - 1])); 
    |   -   ^   - mutable borrow ends here 
    |   |    | 
    |   |    immutable borrow occurs here 
    |   mutable borrow occurs here 

내가보기로

는, v의 불변 차용 잘 떨어한다 :이 컴파일 할 때 그러나, 녹 컴파일러는 다음과 같은 오류를 제공합니다. 즉, v의 변경 가능한 차용이 이전 차용이 삭제 된 이후 v.push()에 대한 가장 바깥 쪽 전화에서 성공할 수 있음을 의미합니다. 내가 잘못 본 건가? 또는이 컴파일러 버그가 무엇입니까?

반복자/생성자를 사용하여이 작업을 수행 할 수도 있지만이 특정 코드 부분에서는 왜 이런 일이 발생했는지 알고 싶습니다. 문제가 될 수 있으므로 다시 읽습니다. .

답변

0

당신이 한 분석을 할 수 있도록 녹의 빌려 오기 검사기의 힘을 확장하는 것이 원칙적으로 가능할 수도 있지만, 빌로우 검사기는 현재 그러한 종류의 추론을 할 수 없습니다.

주어진 오류에서 알 수 있듯이 v.pushv을 차용 한 후 next(v[v.len() - 1])이라는식이 분석됩니다. v은 이미 v.push에 의해 차용되었으므로 빌려 오기 검사가 실패합니다.

차용 검사기는 까다롭기는하지만 분명히 개선 될 수 있지만 지금은 차용 검사기에서 예상되는 동작이므로 해결 방법은 푸시 작업에서 인덱싱 작업을 분리하는 것입니다. 원래 않았다. 컴파일러는 작업을 인라인 할만큼 똑똑합니다 (모든 차용 확인을 한 후에).

+0

[어휘없는 수명] (http://smallcultfollowing.com/babysteps/blog/2016/04/27/non-lexical-lifetimes-introduction/)이 문제가되는 즉시 문제가 해결되어야합니다. 안정된 컴파일러. – user4815162342

관련 문제