我正在尝试应用一些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
上的字段()
,但没有字段 名字被发现
我无法找到我错过的东西。
答案 0 :(得分:7)
Source::new
没有指定返回类型,因此返回()
(空元组,也称为单元)。
因此,src
的类型为()
,其中没有get_char
方法,这是错误消息告诉您的方法。
首先,让我们为new
:fn 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
未使用,但我认为您打算使用它。