找不到方法/字段名称

时间:2016-06-17 09:04:21

标签: rust

我正在尝试应用一些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();报告这些错误:

  

错误:当前没有为类型get_char找到名为()的方法   范围

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

  

尝试访问类型look上的字段(),但没有字段   名字被发现

我无法找到我错过的东西。

1 个答案:

答案 0 :(得分:7)

Source::new没有指定返回类型,因此返回()(空元组,也称为单元)。

因此,src的类型为(),其中没有get_char方法,这是错误消息告诉您的方法。

首先,让我们为newfn new() -> Source设置正确的签名。现在我们得到:

error: not all control paths return a value [E0269]
     fn new() -> Source {
         Source {look: '\0'};
     }

这是因为Rust是一种表达式语言,几乎所有东西都是表达式,除非使用分号将表达式转换为语句。你可以写new

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

或者:

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

后者在Rust中更为惯用。

所以,让我们这样做,现在我们得到:

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

这是因为src被声明为不可变(默认),因为它是可变的,你需要使用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未使用,但我认为您打算使用它。