Rust: & mut self μ°¨μž… μžμ²΄μ™€ μΆ©λŒν•©λ‹ˆλ‹€.

에 λ§Œλ“  2015λ…„ 02μ›” 03일  Β·  20μ½”λ©˜νŠΈ  Β·  좜처: rust-lang/rust

μ™œ 이런 일이 λ°œμƒν•˜λŠ”μ§€ λͺ¨λ₯΄κ² μ§€λ§Œ IRC의 rovar와 XMPPwockyλŠ” 이것이 컴파일러 버그라고 λ―Ώμ—ˆμŠ΅λ‹ˆλ‹€.

struct A {
    a: i32
}

impl A {
    fn one(&mut self) -> &i32{
        self.a = 10;
        &self.a
    }
    fn two(&mut self) -> &i32 {
        loop {
            let k = self.one();
            if *k > 10i32 {
                return k;
            }
        }
    }
}

... λ‹€μŒ 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€ ...

<anon>:12:21: 12:25 error: cannot borrow `*self` as mutable more than once at a time
<anon>:12             let k = self.one();
                              ^~~~
<anon>:12:21: 12:25 note: previous borrow of `*self` occurs here; the mutable borrow prevents subsequent moves, borrows, or modification of `*self` until the borrow ends
<anon>:12             let k = self.one();
                              ^~~~
<anon>:17:6: 17:6 note: previous borrow ends here
<anon>:10     fn two(&mut self) -> &i32 {
...
<anon>:17     }
              ^
error: aborting due to previous error
playpen: application terminated with error code 101

ν₯λ―Έλ‘­κ²Œλ„ 두 번째 방법이 λ‹€μŒκ³Ό 같이 λ³€κ²½λ˜λ©΄ ...

    fn two(&mut self) -> &i32 {
        loop {
            let k = self.one();
            return k;
        }
    }

이것은 잘 μ»΄νŒŒμΌλ©λ‹ˆλ‹€.

놀이 ν‹€ : http://is.gd/mTkfw5

A-NLL A-borrow-checker A-typesystem C-bug NLL-polonius T-compiler

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

λΆˆλ³€μ˜ μ°¨μž…μ΄ λ„ˆλ¬΄ 였래 μ‚¬λŠ” κ²ƒμ²˜λŸΌ λ³΄μ΄λŠ” ν”„λ‘œλ•μ…˜μ—μ„œ λΉ„μŠ·ν•œ λ¬Έμ œκ°€ λ°œμƒν–ˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€ ( ν•΄κ²° 방법 ).

λ˜ν•œ starwed의 μ½”λ“œ κ°€ 더 이상 μ΅œμ‹  야간에 μ»΄νŒŒμΌλ˜μ§€ μ•ŠλŠ”λ‹€λŠ” 점도 μ–ΈκΈ‰ν•΄μ•Όν•©λ‹ˆλ‹€. @oberien 은 " regression-from-nightly-to-nightly "νƒœκ·Έλ₯Ό μ œμ•ˆν–ˆμœΌλ©° 이것이 κΈ΄κΈ‰ν•œ 문제인 경우 @nikomatsakis νƒœκ·Έλ₯Ό λ°›μ•˜μŠ΅λ‹ˆλ‹€ . :)

λͺ¨λ“  20 λŒ“κΈ€

λ‚˜λŠ” 이것이 μ˜¬λ°”λ₯Έ 행동이라고 λ―ΏμŠ΅λ‹ˆλ‹€. 이유λ₯Ό ν™•μΈν•˜λ €λ©΄ λͺ…μ‹œ 적 수λͺ… μ£Όμ„μ΄μžˆλŠ” μ½”λ“œλ₯Ό κ³ λ €ν•˜μ„Έμš”.

struct A {
    a: i32
}

impl A {
    fn one<'a>(&'a mut self) -> &'a i32{
        self.a = 10;
        &self.a
    }
    fn two<'a>(&'a mut self) -> &'a i32 {
        loop {
            let k = self.one();
            if *k > 10i32 {
                return k;
            }
        }
    }
}

two λŠ” 주어진 κ°€λ³€ 차용과 λ™μΌν•œ 수λͺ…을 가진 μ°Έμ‘°λ₯Ό λ°˜ν™˜ν•΄μ•Όν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 그것 λ•Œλ¬Έμ—. μ΄λŠ” k 평생 'a κ°€ μžˆμ–΄μ•Ό 함을 μ˜λ―Έν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜, λ°˜ν™˜ 된 κ°’ one 수λͺ… 갖도둝 'a 에 μž…λ ₯ one λ˜ν•œ 수λͺ…을 가지고 μžˆμ–΄μ•Ό 'a . 이 μˆ˜λ‹¨μ€ λ…Ήν•˜μ§€ μ•Šλ„λ‘ κ°•μ œν•˜λŠ” 것이 "reborrow" self 과에 이동 one . κ°€λ³€ μ°Έμ‘°λŠ” μ„ ν˜•μ΄λ―€λ‘œ ν•œ 번만 이동할 수 μžˆμ§€λ§Œ loop λŠ” one λ™μΌν•œ κ°€λ³€ 참쑰둜 반볡적으둜 ν˜ΈμΆœν•΄μ•Ό ν•  수 μžˆμŒμ„ μ˜λ―Έν•©λ‹ˆλ‹€.

두 번째 μ˜ˆμ œλŠ” Rustκ°€ 루프가 ν•œ 번만 μ‹€ν–‰λœλ‹€λŠ” 것을 μ•Œ 수 있기 λ•Œλ¬Έμ— μž‘λ™ν•˜λ―€λ‘œ self λŠ” ν•œ 번만 μ΄λ™λ©λ‹ˆλ‹€.

이것은 λΉ„ μ–΄νœ˜μ μΈ μ°¨μž… 문제처럼 λ³΄μž…λ‹ˆλ‹€. 루프 없이도 λΉ„μŠ·ν•œ λ™μž‘μ„ 얻을 수 μžˆμŠ΅λ‹ˆλ‹€.

struct Foo { data: Option<i32> }

fn main() {
    let mut x = Foo{data: Some(1)};

    foo(&mut x);
}

fn foo(x: &mut Foo) -> Option<&mut i32> {
    if let Some(y) = x.data.as_mut() {
        return Some(y);
    }

    println!("{:?}", x.data); 
    None
}
<anon>:14:22: 14:28 error: cannot borrow `x.data` as immutable because it is also borrowed as mutable
<anon>:14     println!("{:?}", x.data); 
                               ^~~~~~
note: in expansion of format_args!
<std macros>:2:43: 2:76 note: expansion site
<std macros>:1:1: 2:78 note: in expansion of println!
<anon>:14:5: 14:30 note: expansion site
<anon>:10:22: 10:28 note: previous borrow of `x.data` occurs here; the mutable borrow prevents subsequent moves, borrows, or modification of `x.data` until the borrow ends
<anon>:10     if let Some(y) = x.data.as_mut() {
                               ^~~~~~
<anon>:16:2: 16:2 note: previous borrow ends here
<anon>:9 fn foo(x: &mut Foo) -> Option<&mut i32> {
...
<anon>:16 }
          ^
error: aborting due to previous error

RustcλŠ” 쑰건뢀 μ°¨μž… μˆ˜μ΅μ„ "거래"ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

CC @pcwalton

λ¬Έμ œλŠ” μ‹€μ œλ‘œ λ°˜ν™˜ κ°’μ˜ 가변성이 μ‚¬μš©λ˜μ§€ μ•Šκ³  ν•¨μˆ˜ 인수의 가변성이 μ‚¬μš©λœλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.

λ‹€μŒ μ½”λ“œλŠ” λ³€κ²½ λΆˆκ°€λŠ₯ν•œ μ°Έμ‘°λ₯Ό λ°˜ν™˜ν•˜λŠ” λ³€κ²½ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•©λ‹ˆλ‹€. κ·Έ ν›„μ—λŠ” λΆˆλ³€ μ°Έμ‘°λ₯Ό μ·¨ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

struct Foo (u8);

impl Foo {
    fn bar(&mut self) -> &u8 {
        self.0 += 1;
        &self.0
    }
}

fn main() {
    let mut x = Foo(42);
    let a = x.bar(); // note: borrow of `x` occurs here
    let b = x.0; // error: cannot use `x.0` because it was mutably borrowed
}

놀이 ν‹€

λ‚˜λŠ” μ΅œμ‹  야간에 μ—¬μ „νžˆμ΄ 문제λ₯Ό κ²ͺκ³  μžˆμŠ΅λ‹ˆλ‹€. λ°˜ν™˜μ΄μ—†λŠ” ν•¨μˆ˜κ°€ 차용 검사기λ₯Ό ν†΅κ³Όν•˜λ”λΌλ„ ν•¨μˆ˜κ°€ 끝날 λ•ŒκΉŒμ§€ λ°˜ν™˜μ„ 수λͺ…μ΄μžˆλŠ” κ²ƒμœΌλ‘œ κ°„μ£Όν•˜λŠ” κ²ƒμœΌλ‘œ λ³΄μž…λ‹ˆλ‹€. λ°˜ν™˜ 지점이 ν•¨μˆ˜λ₯Ό 쑰기에 μ’…λ£Œν•˜λŠ” 방법을 κ³ λ €ν•˜λ©΄ λ‹€μ†Œ 이상해 λ³΄μž…λ‹ˆλ‹€.

@Gankro 의 예제λ₯Ό

이것은 λΉ„ μ–΄νœ˜ 수λͺ…μ—μ„œ μ°¨λ‹¨λ˜λ©° MIRμ—μ„œ μ°¨λ‹¨λ©λ‹ˆλ‹€. μ΄μƒμ μœΌλ‘œλŠ” 2016 λ…„ λ§κΉŒμ§€ μˆ˜μ • 될 κ²ƒμ΄μ§€λ§Œ 곧 μˆ˜μ •λ˜μ§€λŠ” μ•Šμ„ κ²ƒμž…λ‹ˆλ‹€.

λΉ„ μ–΄νœ˜ 차용 κΈ°λŠ₯ ν† λ‘  : https://github.com/rust-lang/rfcs/issues/811

κ·Έλž˜μ„œ [internals thread]λ₯Ό 읽으면 이것이 κ³ μΉ  μˆ˜μ—†λŠ” κ²ƒμ²˜λŸΌ λŠκ»΄μ§‘λ‹ˆλ‹€ (NLL을 μ‚¬μš©ν•΄λ„). λˆ„κ΅°κ°€ 확인할 수 μžˆμŠ΅λ‹ˆκΉŒ? (@eddyb?)

cc @ νœ΄μ‹-μž₯ / μž₯

이것은 μ‹€μ œλ‘œ NLL이고, λ‚΄κ°€ μ°©κ°ν•˜μ§€ μ•ŠμœΌλ©΄ λ‚΄κ°€ λ§Œλ“  λ‹€μ–‘ν•œ μ œμ•ˆμœΌλ‘œ μˆ˜μ • 될 κ²ƒμž…λ‹ˆλ‹€. 이것은 λŒ€λž΅ λ‚΄ 첫 λΈ”λ‘œκ·Έ κ²Œμ‹œλ¬Όμ˜ "문제 사둀 # 3"에 ν•΄λ‹Ήν•©λ‹ˆλ‹€. 이것이 μž‘λ™ν•˜λŠ” μ΄μœ μ— λŒ€ν•œ κΈ°λ³Έ 아이디어 ( μ΅œμ‹  λΈ”λ‘œκ·Έ κ²Œμ‹œλ¬Όμ˜ 곡식 μΈ‘λ©΄ if λΆ„κΈ°μ˜ 'a λκΉŒμ§€ 만 μ—°μž₯ν•˜λ©΄λœλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. if λ₯Ό μœ λ°œν•˜λŠ” return .

@nikomatsakis NLL이이 λ¬Έμ œμ™€ μ–΄λ–»κ²Œ μƒν˜Έ μž‘μš©ν•˜λŠ”μ§€ μžμ„Ένžˆ &mut 참쑰의 λ‚΄ μ •μ‹  λͺ¨λΈμ—μ„œλŠ” move λ˜λŠ” reborrowλ₯Ό 톡해 전달할 수 이동 λͺ¨λ“œκ°€ ν•„μš”ν•˜κ³  self 의 μž¬μ‚¬μš©μ΄ ν•„μš”ν•˜λ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. λ‚˜μ€‘μ— λ‹€μ‹œ λΉŒλ €μ•Ό ν•©λ‹ˆλ‹€. λ‚΄ 이해에 λ”°λ₯΄λ©΄ μƒˆλ‘œ 재 빌린 &mut 참쑰의 수λͺ…은 &mut -referenceλ₯Ό λ³΄μœ ν•œ λ³€μˆ˜μ˜ 수λͺ…에 μ˜ν•΄ μ œν•œλ©λ‹ˆλ‹€.이 κ²½μš°μ—λŠ” self λ³€μˆ˜μ— μ˜ν•΄ μ œν•œλ©λ‹ˆλ‹€. λ”°λΌμ„œ ν•¨μˆ˜ 호좜 μ™ΈλΆ€λ‘œ ν™•μž₯ ν•  수 μ—†μŠ΅λ‹ˆλ‹€. NLL이 재 μ°¨μž… μ œν•œμ„ λ³€κ²½ν•©λ‹ˆκΉŒ (λ˜λŠ” κ·ΈλŸ¬ν•œ μ œν•œμ΄ 없을 μˆ˜λ„ 있음)?

λ˜ν•œμ΄ 문제λ₯Ό ν•΄κ²°ν•˜λŠ” 것이 본질적으둜 NLLκ³Ό 관련이 μžˆλŠ”μ§€ μ•„λ‹ˆλ©΄ 직ꡐ ν•  수 μžˆλŠ”μ§€ κΆκΈˆν•©λ‹ˆλ‹€. ν›„μžλΌλ©΄ NLL 이전에 μˆ˜μ •μ„ ν•  κ°€μΉ˜κ°€ μžˆμŠ΅λ‹ˆκΉŒ?

λ˜ν•œ NLL이이 문제λ₯Ό ν•΄κ²°ν•˜λ €λŠ” 경우 NLLμ—μ„œ 이동과 재 μ°¨μž… μ€‘μ—μ„œ μˆ˜λ™μœΌλ‘œ 선택할 ν•„μš”κ°€ μ—†λ‹€λŠ” μ˜λ―Έμž…λ‹ˆκΉŒ?

μ‘°λ§Œκ°„ μˆ˜μ • 될 μ˜ˆμ •μž…λ‹ˆκΉŒ?

λΏ‘λΏ‘

NLL이이 λ¬Έμ œμ™€ μ–΄λ–»κ²Œ μƒν˜Έ μž‘μš©ν•˜λŠ”μ§€ μžμ„Ένžˆ μ„€λͺ…ν•΄ μ£Όμ‹œκ² μŠ΅λ‹ˆκΉŒ?

μš”μ•½μ€ 값이 μ–΄λ–€ 경둜의 κΈ°λŠ₯ λ°–μœΌλ‘œ λ°˜ν™˜λ©λ‹ˆλ‹€ 경우 였늘, λŒ€μΆœμ€ λͺ¨λ“  경둜의 κΈ°λŠ₯의 λ‚˜λ¨Έμ§€ 뢀뢄에 λŒ€ν•œ μœ νš¨ν•œ κ²ƒμ΄μ–΄μ•Όν•œλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. λ‚΄κ°€ μž‘μ„±ν•œ NLL μ œμ•ˆμ— 따라 κ·Έ μ œν•œμ΄ ν•΄μ œλ˜μ—ˆμŠ΅λ‹ˆλ‹€.

더 μžμ„Έν•˜κ²Œ μ—¬κΈ°μ—μ„œ μ •κ΅ν•œ μ„œλͺ…을 λ°›μœΌλ©΄ 수λͺ…이 'a μ°Έμ‘°λ₯Ό λ°˜ν™˜ν•΄μ•Ό 함을 μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€.

fn two<'a>(&'a mut self) -> &'a i32 { .. }

이제 let k = self.one() 호좜 ν•œ λ‹€μŒ k λ₯Ό λ°˜ν™˜ν•˜λŠ” 것을 ν™•μΈν•©λ‹ˆλ‹€. μœ ν˜• 것을이 μˆ˜λ‹¨ k μžˆμ–΄μ•Όν•©λ‹ˆλ‹€ &'a i32 . μ΄λŠ” λ‹€μ‹œ self.one() 호좜 ν•  λ•Œ &'a mut Self μœ ν˜•μœΌλ‘œ self μ°¨μš©μ„ μ œκ³΅ν•΄μ•Ό 함을 μ˜λ―Έν•©λ‹ˆλ‹€. λ”°λΌμ„œ let k = self.one() self μ—μ„œ 평생 'a 둜 self λŒ€μΆœμ„ λ°œν–‰ν•©λ‹ˆλ‹€. 이 수λͺ…은 루프 (μ‹€μ œλ‘œ 전체 ν•¨μˆ˜)보닀 크기 λ•Œλ¬Έμ— 루프λ₯Ό λŒμ•„ 닀닐 λ•Œ μ§€μ†λ˜μ–΄ 였λ₯˜λ³΄κ³ κ°€ λ°œμƒν•©λ‹ˆλ‹€. λ‚΄κ°€ μ œμ•ˆν•˜λŠ” NLL κ·œμΉ™μ—μ„œμ˜ 수λͺ… k λ‹¨μ§€κΉŒμ§€ μ—°μž₯ ν•  ν•„μš”κ°€ 'a 경우 if 취해진 λ‹€. λ”°λΌμ„œ if λ₯Όλ°›μ§€ μ•ŠμœΌλ©΄ λŒ€μΆœμ΄ 더 일찍 μ’…λ£Œ 될 수 μžˆμŠ΅λ‹ˆλ‹€.

도움이 λ˜λ‚˜μš”?


@ osa1

μ‘°λ§Œκ°„ μˆ˜μ • 될 μ˜ˆμ •μž…λ‹ˆκΉŒ?

이 μž‘μ—…μ„ μˆ˜ν–‰ν•˜κΈ° 전에 아직 λͺ‡ 단계λ₯Ό κ±°μ³μ•Όν•˜μ§€λ§Œ ν•„μš”ν•œ λ¦¬νŒ©ν† λ§μ„ μˆ˜ν–‰ν•˜κΈ°μœ„ν•œ 적극적인 μž‘μ—…μ΄ μžˆμŠ΅λ‹ˆλ‹€.

λΏ‘ 빡뀨
κ°μ‚¬ν•©λ‹ˆλ‹€. λ‹€μ†Œ λ„μ›€μ΄λ˜μ—ˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ μ œκ°€ μ΄ν•΄ν•˜μ§€ λͺ»ν•˜λŠ” ν•œ 가지 μž‘μ€ 것이 μžˆμŠ΅λ‹ˆλ‹€. self λ₯Ό μ½”λ“œμ— μž‘μ„±ν•  λ•Œ μ •ν™•νžˆ μ–΄λ–€ 일이 λ°œμƒν•˜λŠ”μ§€ – self 의 재 μ°¨μž…μ΄ μž‘λ™ν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€. 호좜자 λ‚΄λΆ€μ—μ„œ μ½”λ“œλ₯Ό μΈλΌμΈν•˜λŠ” "문제 사둀 3"( get_default )에 λŒ€ν•œ μ„€λͺ…을 μ½μ—ˆμ§€λ§Œ self 의 λͺ¨λ“  μ‚¬μš©μ„ 차용으둜 λ³€κ²½ν–ˆμŠ΅λ‹ˆλ‹€. map λ³€μˆ˜λ₯Ό 직접 μ‚¬μš©ν•˜μ—¬ desugaring으둜 ν•΄κ²°λ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.

μ œκ°€ κ°‡ν˜€μžˆλŠ” 뢀뢄은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€. let k = self.one() ν˜ΈμΆœν•˜λ©΄ self λ₯Ό 이동할 수 μ—†μœΌλ―€λ‘œ (λ‚˜μ€‘μ— ν•„μš”ν•˜κΈ° λ•Œλ¬Έμ—) 빌린 κ²ƒμœΌλ‘œ κ°„μ£Όλ©λ‹ˆλ‹€. λ‚˜μ€‘μ— μ‘°κ±΄λΆ€λ‘œ k λ°˜ν™˜ν•˜λ―€λ‘œ, μ°¨μš©μ€ ν•¨μˆ˜ ν˜ΈμΆœλ³΄λ‹€ 였래 μ§€μ†λ˜λŠ” 'a 수λͺ…을 κ°€μ Έμ•Όν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜! ν•¨μˆ˜κ°€ 끝날 λ•ŒκΉŒμ§€λ§Œ μœ μ§€λ˜λŠ” self μ—μ„œ μ°¨μš©ν–ˆμŠ΅λ‹ˆλ‹€. κ·Έ μ œν•œμ€ 'a λ₯Ό μ€„μ—¬μ£ΌλŠ” κ²ƒμ²˜λŸΌ λ³΄μ΄λ―€λ‘œ NLL ν•˜μ—μ„œλ„ μ •μ‹  λͺ¨λΈμ—μ„œ "μΆ©λΆ„νžˆ 였래 살지 μ•ŠμŒ"였λ₯˜κ°€ λ°œμƒν•΄μ•Όν•©λ‹ˆλ‹€.

@krdln μš°λ¦¬λŠ” μ‹€μ œλ‘œ *self μ—μ„œ μ°¨μš©ν–ˆμŠ΅λ‹ˆλ‹€. 즉, selfκ°€ μ°Έμ‘°ν•˜λŠ” 것을 λ‹€μ‹œ 빌 λ ΈμŠ΅λ‹ˆλ‹€. μš°λ¦¬λŠ” λŒ€μΆœ ν•  수 μžˆλ„λ‘ ν—ˆμš© *self 평생이 였래 살지에 λŒ€ν•΄ self 의 μœ ν˜• λ•Œλ¬Έμ— μžμ‹ μ„ self 전체 수λͺ…에 λŒ€ν•œ '잠금'을 의미 'a . λ”°λΌμ„œ 'a λ™μ•ˆ selfκ°€ 더 이상 μ‚¬μš©λ˜μ§€ μ•ŠλŠ”λ‹€λŠ” 것을 보μž₯ ν•  μˆ˜μžˆλŠ” ν•œ κ²°κ³ΌλŠ” 배타적 μ°Έμ‘°κ°€λ˜μ–΄μ•Όν•©λ‹ˆλ‹€.이 경우 fn이 λ°˜ν™˜ 된 ν›„ selfκ°€ νŒλ˜μ—ˆμœΌλ―€λ‘œ μ‚¬μš©ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ fn이 끝날 λ•ŒκΉŒμ§€ selfκ°€ μ‚¬μš©λ˜μ§€ μ•Šλ„λ‘ 보μž₯ν•©λ‹ˆλ‹€. (적어도 그게 사싀 이길 λ°”λžλ‹ˆλ‹€. =)

이것은 λΉ„ μ–΄νœ˜ 수λͺ…μ—μ„œ μ°¨λ‹¨λ˜λ©° MIRμ—μ„œ μ°¨λ‹¨λ©λ‹ˆλ‹€. μ΄μƒμ μœΌλ‘œλŠ” 2016 λ…„ λ§κΉŒμ§€ μˆ˜μ • 될 κ²ƒμ΄μ§€λ§Œ 곧 μˆ˜μ •λ˜μ§€λŠ” μ•Šμ„ κ²ƒμž…λ‹ˆλ‹€.

그닀지 λ†€λžμ§€λŠ” μ•Šμ§€λ§Œ λΉ„ μ–΄νœ˜ 수λͺ… κΈ°λŠ₯을 켜면 초기 μ˜ˆμ œκ°€ μ‹€μ œλ‘œ 야간에 컴파일 λœλ‹€λŠ” 것을 ν™•μΈν–ˆμŠ΅λ‹ˆλ‹€.

λΆˆλ³€μ˜ μ°¨μž…μ΄ λ„ˆλ¬΄ 였래 μ‚¬λŠ” κ²ƒμ²˜λŸΌ λ³΄μ΄λŠ” ν”„λ‘œλ•μ…˜μ—μ„œ λΉ„μŠ·ν•œ λ¬Έμ œκ°€ λ°œμƒν–ˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€ ( ν•΄κ²° 방법 ).

λ˜ν•œ starwed의 μ½”λ“œ κ°€ 더 이상 μ΅œμ‹  야간에 μ»΄νŒŒμΌλ˜μ§€ μ•ŠλŠ”λ‹€λŠ” 점도 μ–ΈκΈ‰ν•΄μ•Όν•©λ‹ˆλ‹€. @oberien 은 " regression-from-nightly-to-nightly "νƒœκ·Έλ₯Ό μ œμ•ˆν–ˆμœΌλ©° 이것이 κΈ΄κΈ‰ν•œ 문제인 경우 @nikomatsakis νƒœκ·Έλ₯Ό λ°›μ•˜μŠ΅λ‹ˆλ‹€ . :)

맀우 μœ μ‚¬ν•œ μž‘μ—…μ„ μ‹œλ„ν•˜λŠ”μ΄ 문제λ₯Ό λ°œκ²¬ν–ˆμŠ΅λ‹ˆλ‹€ (ν˜„μž¬ nllμ—μ„œλŠ” ν—ˆμš©λ˜μ§€ μ•ŠμŒ).

fn f(vec: &mut Vec<u8>) -> &u8 {
    if let Some(n) = vec.iter_mut().find(|n| **n == 1) {
        *n = 10;
        n
    } else {
        vec.push(10);
        vec.last().unwrap()
    }
}

fn main() {
    let mut vec = vec![1, 2, 3];
    f(&mut vec);
}
error[E0499]: cannot borrow `*vec` as mutable more than once at a time
 --> src/main.rs:6:9
  |
1 | fn f(vec: &mut Vec<u8>) -> &u8 {
  |           - let's call the lifetime of this reference `'1`
2 |     if let Some(n) = vec.iter_mut().find(|n| **n == 1) {
  |                      --- first mutable borrow occurs here
3 |         *n = 10;
4 |         n
  |         - returning this value requires that `*vec` is borrowed for `'1`
5 |     } else {
6 |         vec.push(10);
  |         ^^^ second mutable borrow occurs here

error[E0502]: cannot borrow `*vec` as immutable because it is also borrowed as mutable
 --> src/main.rs:7:9
  |
1 | fn f(vec: &mut Vec<u8>) -> &u8 {
  |           - let's call the lifetime of this reference `'1`
2 |     if let Some(n) = vec.iter_mut().find(|n| **n == 1) {
  |                      --- mutable borrow occurs here
3 |         *n = 10;
4 |         n
  |         - returning this value requires that `*vec` is borrowed for `'1`
...
7 |         vec.last().unwrap()
  |         ^^^ immutable borrow occurs here

(NLL에 μ˜ν•΄ κ³ μ • 된 NLL을 제거 ν•  λ•Œ E-needstestλ₯Ό 제거 ν–ˆμ–΄μ•Όν•©λ‹ˆλ‹€)

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰