나는이 작동 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()
에 대한 가장 바깥 쪽 전화에서 성공할 수 있음을 의미합니다. 내가 잘못 본 건가? 또는이 컴파일러 버그가 무엇입니까?
반복자/생성자를 사용하여이 작업을 수행 할 수도 있지만이 특정 코드 부분에서는 왜 이런 일이 발생했는지 알고 싶습니다. 문제가 될 수 있으므로 다시 읽습니다. .
[어휘없는 수명] (http://smallcultfollowing.com/babysteps/blog/2016/04/27/non-lexical-lifetimes-introduction/)이 문제가되는 즉시 문제가 해결되어야합니다. 안정된 컴파일러. – user4815162342