在一个新的Rust模块中,我可以编写:
struct myStruct {
x : u32
}
impl myStruct {
fn new() -> myStruct{
myStruct{ x : other()}
}
fn other() -> u32 {
6
}
}
来自其他OO语言,我希望other()
在new()
的范围内。也就是说,我希望能够从同一个类的另一个静态方法中调用一个类的一个静态方法。但是,rustc会生成消息:
error[E0425]: cannot find function `other` in this scope
--> dummy_module.rs:9:23
|
9 | myStruct{ x : other()}
| ^^^^^ not found in this scope
相反,以下Java代码可以很好地编译:
public class myStruct{
int x;
public myStruct(){
x = other();
}
private int other(){
return 5;
}
}
我不记得在我正在使用的Rust书中看到过任何提及,而且我似乎无法在网上找到明确的答案。我可以通过使用myStruct::other()
明确限制对其他人的调用来解决此问题,但这似乎很麻烦。如果我尝试use myStruct
,那么我得到的是隐秘消息
7 | use myStruct;
| ^^^ unexpected token
是否总是需要这种显式作用域?如果是这样,为什么?
我做错了什么吗?是否有惯用的解决方法?
答案 0 :(得分:7)
Rust设计师做出了以下选择:与范围相关的所有内容都是明确的。因此,就像必须键入self
来从另一个成员函数self.foo()
调用成员函数一样,您必须使用Self
:Self::bar()
调用静态成员。
我认为是这样的,因为self
不能隐式:确实必须通过值或借来将其作为参数添加,这与Java中this
总是按值进行获取不同。 。因此,由于self
已经是一个显式参数,因此需要使用它作为一致性的显式调用方。
由于其内存模型,Rust明确性允许提供更好的错误消息。例如,考虑以下代码:
struct Struct;
impl Struct {
fn foo(&mut self) {
self.consume();
}
fn consume(self) {}
}
错误消息是:
error[E0507]: cannot move out of borrowed content
--> src/main.rs:5:9
|
5 | self.consume();
| ^^^^ cannot move out of borrowed content
然后,团队选择完全明确的方式来保持语法的连贯性。
答案 1 :(得分:1)
是的,因为rust不是Java;)
您只需写:
myStruct { x: myStruct::other() }
或
myStruct { x: Self::other() }
我无法告诉您确切的设计决策,为什么不自动导入Self
函数,但是您可以使用正确的路径来“解决”此问题。