ฉันจะเรียกใช้ฟังก์ชันได้อย่างไรเมื่อตัวแปรและฟังก์ชันมีชื่อเหมือนกัน


10

ตัวแปรและฟังก์ชั่นมีชื่อเดียวกัน ฉันจะเรียกฟังก์ชั่นได้อย่างไร

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

คอมไพเลอร์ Rust บอกฉัน:

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

กล่าวอีกนัยหนึ่งคอมไพเลอร์ Rust ไม่ได้เรียกใช้aฟังก์ชัน แต่เข้าถึงaตัวแปร


10
ฉันจะระบุวิธีแก้ปัญหาที่ชัดเจน: ไม่มีอะไรบังคับให้ตัวแปรของคุณมีชื่อเหมือนกับฟังก์ชัน เปลี่ยนมัน
Shepmaster

คำตอบ:


9

printlnนี้ไม่สามารถทำได้เพราะคุณไม่ได้มีทั้งฟังก์ชั่นและจำนวนเต็มอยู่ในขอบเขตที่คุณมีของคุณ

เนื่องจากโดยทั่วไปจะมีฟังก์ชั่นการใช้งานสำหรับขอบเขตทั้งหมด (เช่นคุณสามารถใช้พวกเขาก่อนการประกาศ) การประกาศของพวกเขาจะถูกย้ายแนวคิดไปยังจุดเริ่มต้นของขอบเขต (พวกเขา "hoisted")

ผลที่ตามมาก็คือการประกาศฟังก์ชั่นอยู่ก่อนการประกาศตัวแปรจำนวนเต็มและเป็นเงา

การแก้ไขรหัสที่แท้จริงของคุณจะขึ้นอยู่กับสถานการณ์ที่แน่นอนของคุณ อาจจะเป็นสิ่งนี้:

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

4
ตัวอย่างเงาย้อนกลับเพื่อแสดงความคิดเดียวกัน: play.rust-lang.org/…
Ömer Erden

1
หรือคุณรู้ว่าไม่ใช้ชื่อเดียวกันสำหรับวัตถุที่แตกต่างกันสองรายการ
สะสม

ยกแนวคิด ดูเหมือนว่าข้อผิดพลาดให้ฉัน; ขอบเขตควรอยู่ในลำดับศัพท์ EOF-y หงายขึ้นไม่มีสัญญาณรบกวน
Kaz

4
@Kaz In Rust คุณสามารถเรียกฟังก์ชั่นโดยไม่สนใจว่ามันถูกประกาศก่อนหรือหลังฟังก์ชั่นที่คุณเป็น นี่ไม่ใช่ข้อผิดพลาดมันสะดวกมาก
Denys Séguret

@ DenysSéguretในกรณีนั้นตัวระบุทั้งหมดในเนมสเปซนั้นควรเป็นไปตามกฎเดียวกัน ถ้าฉันมีตัวแปรที่มีค่าฟังก์ชัน มันควรได้รับการปฏิบัติอย่างเท่าเทียมกันด้วยการผสมผสานของฟังก์ชั่นในขอบเขตเดียวกัน
Kaz
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.