2017-01-02 5 views
1

변경 가능한 인수가 함수 인수로 전달되면 borrow checker는 참조를 보유하지 않고 값을 복제 할 때도 인수가 다른 인수를 생성하는 데 사용되지 않도록합니다.Rust에서 체커와 함수 인자를 빌려주 는가, 정확하고 열정적인가?

함수 외부에 변수를 할당하는 것은 항상 옵션입니다. 논리적으로 볼 때 이는 열심히 보며 빌려가는 사람이 고려할 수 있습니다.

의도 한대로 작동합니까 아니면 해결해야 할 것이 있습니까?

--> src/main.rs:14:21 
    | 
14 |  some_fn(&mut v, v.some_other + 1); 
    |     - ^^^^^^^^^^^^ use of borrowed `v` 
    |     | 
    |     borrow of `v` occurs here 

참조 : playpen

#[derive(Debug)] 
struct SomeTest { 
    pub some_value: f64, 
    pub some_other: i64, 
} 

fn some_fn(var: &mut SomeTest, other: i64) { 
    println!("{:?}, {}", var, other); 
} 

fn main() { 
    let mut v = SomeTest { some_value: 1.0, some_other: 2 }; 
    some_fn(&mut v, v.some_other + 1); 

    // However this works! 
/* 
    { 
     let x = v.some_other + 1; 
     some_fn(&mut v, x); 
    } 
*/ 
} 

이 오류를 제공합니다.

[1]


는 : 일회성 할당 때때로 가독성을 향상 않더라도, 인수를 사용하도록 강제 함수 호출을 유발, 이름 공간을 오염 일회용 변수를 방지하기 위해 범위의 사용을 장려하고 그 그렇지 않은 것 하나의 라인이 될 것입니다 - 중괄호와 변수를 정의하고 있습니다 ... 필요하다면 빌리 체커가 지원할 수있는 것과 같이 특히 가능할 때 이것을 피하고 싶습니다.

답변

3

이것은 차용 검사기의 현재 구현 결과 인 아티팩트입니다. 그것은 잘 알려진 제한 사항이며, 이상이고 적어도 2013이며 누구도 그것에 대해 너무 기뻐하지 않습니다.

Is this working as intended

예.

something that should be resolved?

예.

마법 키워드는 "어휘없는 (non-lexical) 수명"입니다. 현재 수명은 어휘입니다. 입력 한 소스 블록에 해당합니다. 이상적으로, foo.method(foo.mutable_method())은 차용이 "괄호 안에"끝나는 것을 볼 수 있지만, 수많은 이유 때문에 전체 문장에 묶여 있습니다.

자세한 내용은 RFC issue 811 및 모든 정보가 여기에 나와 있습니다.

+1

이전에 답변을 받았지만 중복 된 것을 찾을 수 없습니다. 당신이 그것을 발견하면, 알려주고 그것을 닫을 것입니다. – Shepmaster

+0

와우, 나는 매우 비슷한 문제를 발견했습니다. 'vec.drain (vec.len() - 1 ..)'은 허용되지 않는 반면,'let vlen = vec.len(); vec.drain (vlen - 1 ..)'이 잘 컴파일됩니다. 해결 방법은 사소한 일이지만, 실제로는 이전의 것을 거의 후자와 같은 것으로 상상할 수 있으므로 잘못 생각합니다. 근본 원인이 같다고 가정합니다. – user4815162342

+1

@ user4815162342 예. – Shepmaster