在一个新的Rust模块中,我可以写:

struct myStruct {
    x : u32
}

impl myStruct {
    fn new() -> myStruct{
        myStruct{ x : other()}
    }

    fn other() -> u32 {
        6
    }
}

来自其他OO语言,我预计new()的范围将达到other().一个类的静态调用与另一个类的静态调用是一样的.然而,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()来修复它,但这似乎很麻烦.如果我try use myStruct,我就会得到神秘的信息

7 |     use myStruct;
  |     ^^^ unexpected token

是否总是需要这种明确的范围界定?如果是,为什么?

我做错什么了吗?有没有一个惯用的解决方法?

推荐答案

Rust设计师做出了以下 Select :与范围相关的所有内容都是明确的.所以,正如您必须键入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

然后,研究小组 Select 完全明确,以保持语法连贯.

Rust相关问答推荐

如何在tauri—leptos应用程序中监听后端值的变化?""

为什么我的梅森素数代码的指数越大,速度就越快?

为什么复印是豆荚的一个重要特征?

如何仅使用http机箱发送http请求?

两个相关特征的冲突实现错误

铁 rust 中的共享对象实现特征

在铁 rust 中传递所有权

我如何制作一个变异迭代器来锁定内部数据直到删除?

Rust 的多态现象.AsRef与Derf

`Pin`有没有不涉及不安全代码的目的?

需要哪些编译器优化来优化此递归调用?

如何递归传递闭包作为参数?

哪些特征通过 `Deref` 而哪些不通过?

在异步 Rust 中,Future 如何确保它只调用最近的 Waker?

将一片字节复制到一个大小不匹配的数组中

用逗号分隔字符串,但在标记中使用逗号

TcpStream::connect - 匹配武器具有不兼容的类型

覆盖类型的要求到底是什么?为什么单个元素元组满足它?

Rust:如果我知道只有一个实例,那么将可变borrow 转换为指针并返回(以安抚borrow 判断器)是否安全?

当值是新类型包装器时,对键的奇怪 HashMap 生命周期要求