2016-06-17 4 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には返される型が指定されていないため、()(空のタプル、ユニットとも呼ばれます)を返します。

結果として、は、get_charメソッドを持っていません。これは、エラーメッセージがあなたに伝えているものです。

まず、まずnewfn 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! 
} 

ルスト後者​​はより多くの慣用的。

だから、今、私たちが得る、というのはやらせる:あなたがlet mut srcを使用する必要が可変であるためにsrcは、(デフォルト)不変宣言されているためである

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

を。

これですべて機能します!


決勝コード:

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'}; '(セミコロン付き)の型は'() 'です。 –

関連する問題