2016-06-17 1 views
1

일부 OOP를 적용하려고하는데 문제가 있습니다.메서드/필드 이름이 없습니다.

use std::io::Read; 

struct Source { 
    look: char 
} 

impl Source { 
    fn new() { 
     Source {look: '\0'}; 
    } 

    fn get_char(&mut self) { 
     self.look = 'a'; 
    } 
} 


fn main() { 
    let src = Source::new(); 
    src.get_char(); 

    println!("{}", src.look); 
} 

는 컴파일러 src.get_char(); 이러한 오류를보고합니다

error: no method named get_char found for type () in the current scope

println!("{}", src.look);을 위해 :

attempted access of field look on type () , but no field with that name was found

내가보고 싶었어 무엇인지 찾을 수 있습니다.

답변

7

Source::new에는 반환 유형이 지정되어 있지 않으므로 () (단위라고도하는 빈 튜플)을 반환합니다.

결과적으로 srcget_char 메서드가 없으므로 () 유형을 가지고 있습니다. 이는 오류 메시지가 말하는 것입니다.

우선, 우선 new : fn new() -> Source에 적절한 서명을 설정해 보겠습니다. 이제 우리는 얻을 : 세미콜론은 문장으로 표현을 변환하는 데 사용하지 않는

녹는 표현 언어이기 때문이 발생
error: not all control paths return a value [E0269] 
    fn new() -> Source { 
     Source {look: '\0'}; 
    } 

는 거의 모든 것이 표현이다. 당신은 쓸 수 new 중 하나

fn new() -> Source { 
    return Source { look: '\0' }; 
} 

또는 :

fn new() -> Source { 
    Source { look: '\0' } // look Ma, no semi-colon! 
} 

녹에 후자 더 관용적.

그래서, 지금 우리가 얻을의 그렇게하자 src (기본값) 불변의 선언되기 때문에

error: cannot borrow immutable local variable `src` as mutable 
    src.get_char(); 
    ^~~ 

어느, 당신이 let mut src를 사용할 필요가 가변 될 수 있도록.

이제는 모두 작동합니다!


최종 코드 :

use std::io::Read; 

struct Source { 
    look: char 
} 

impl Source { 
    fn new() -> Source { 
     Source {look: '\0'} 
    } 

    fn get_char(&mut self) { 
     self.look = 'a'; 
    } 
} 

fn main() { 
    let mut src = Source::new(); 
    src.get_char(); 

    println!("{}", src.look); 
} 

참고 :이 std::io::Read 사용하지 않는 때문에 경고입니다,하지만 난 당신이 그것을 사용할 계획 가정합니다.

+0

..하지만 많은 새로운 언어가 있기 때문에 Rust에는 _return 형식 유추가 있다고 생각했습니다. 왜 내가 쓴 줄에서'new'의 반환 유형을 추측하지 못합니까? – deepmax

+5

@deepmax : Rust는 함수 내에서 유형 유추 *를 갖고 있지만 명시 적으로 함수 시그니처가 필요합니다. 그러나 그럴 경우에도 'new'는 세미콜론 (;)으로 인해'()'를 반환해야한다고 결론 지을 수 있습니다. 'Source {look : '\ 0'}'의 타입은'Source'이지만'Source {look : '\ 0'};'(세미콜론과 함께)의 타입은'()'입니다. –

관련 문제