当变量和函数具有相同的名称时,如何调用函数?


10

变量和函数具有相同的名称。如何调用该函数?

fn main() {
    let a = 1;
    fn a() -> i32 {
        2
    }
    println!("{}", a());
}

Rust编译器告诉我:

error[E0618]: expected function, found `{integer}`

换句话说,Rust编译器不调用该a函数,而是访问该a变量。


10
我将陈述一个显而易见的解决方案:没有什么可以强迫您的变量具有与函数相同的名称。更改。
Shepmaster

Answers:


9

之所以无法这样做,是因为您在函数所在的范围内既没有函数也没有整数println

因为函数通常在整个作用域中都可用(即,您可以在声明它们之前使用它们),所以它们的声明从概念上讲移到了作用域的开头(被“吊起”)。

结果是函数声明在整数变量声明之前,并且被遮盖。

代码的真正解决方法取决于您的实际情况。也许是这样的:

fn main() {
    {
        let a = 1;
        // use the integer there
    }
    fn a() -> i32 {
        2
    }
    println!("{}", a());
}

4
反向阴影例子表达了同样的想法:play.rust-lang.org/...
奥马尔埃尔登

1
或者,您知道不要对两个不同的对象使用相同的名称。
累积

从概念上讲?对我来说似乎是个虫子;作用域应按词汇顺序排列。EOF-y朝上,不加扰。
卡兹(Kaz)

4
@Kaz在Rust中,您可以调用一个函数,而不管它是在您所在的函数之前还是之后声明的。这不是错误,非常方便
DenysSéguret19年

@DenysSéguret在这种情况下,该名称空间中的所有标识符应遵循相同的规则。如果我有一个函数值变量,该怎么办?在同一个范围内,应该混合使用各种功能来平等对待它。
哈兹(Kaz)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.