जब चर और फ़ंक्शन का समान नाम हो, तो मैं फ़ंक्शन को कैसे कॉल करूं?


10

एक चर और फ़ंक्शन का एक ही नाम है। मैं फ़ंक्शन को कैसे कॉल करूं?

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

जंग संकलक ने मुझे बताया:

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

दूसरे शब्दों में, रस्ट कंपाइलर aफ़ंक्शन को कॉल नहीं करता है , बल्कि aचर को एक्सेस करता है।


10
मैं स्पष्ट समाधान बताता हूं: आपके चर को फ़ंक्शन के समान नाम रखने के लिए मजबूर करने के लिए कुछ भी नहीं है । बदल दें।
शेमपस्टर

जवाबों:


9

ऐसा इसलिए नहीं किया जा सकता क्योंकि आपके पास फ़ंक्शन और पूर्णांक दोनों उस दायरे में नहीं हैं जहाँ आपके पास है println

क्योंकि फ़ंक्शंस आम तौर पर पूरे दायरे के लिए उपलब्ध होते हैं (यानी आप उन्हें अपनी घोषणा से पहले उपयोग कर सकते हैं), उनकी घोषणा को वैचारिक रूप से स्कोप के प्रारंभ में ले जाया जाता है (वे "लहराए गए" हैं)।

एक परिणाम यह है कि फ़ंक्शन घोषणा पूर्णांक चर घोषणा से पहले है और छायांकित है।

आपके कोड का वास्तविक निर्धारण आपकी सटीक स्थिति पर निर्भर करेगा। शायद कुछ इस तरह:

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

4
एक ही विचार को व्यक्त करने के लिए रिवर्स शैडिंग
Erden

1
या, आप जानते हैं, दो अलग-अलग वस्तुओं के लिए एक ही नाम का उपयोग नहीं करते हैं।
संचय

वैचारिक रूप से फहराया गया? मेरे लिए एक बग की तरह लग रहा है; गुंजाइश शाब्दिक क्रम में होनी चाहिए। ईओएफ-वाई साइड अप, स्क्रैम्बल नहीं।
कज़

4
@ काज़ इन रुस्ट आप एक फ़ंक्शन को अवहेलना कर सकते हैं कि क्या यह पहले या उसके बाद घोषित किया गया था जिसमें आप हैं। यह एक बग नहीं है, यह बहुत सुविधाजनक है
Denys Séguret

@ DenysSéguret उस मामले में, उस नाम स्थान के सभी पहचानकर्ताओं को एक ही नियम का पालन करना चाहिए। यदि मेरे पास फ़ंक्शन-वैल्यू चर है तो क्या होगा? इसे समान दायरे में कार्यों के मिश्रण के साथ समान रूप से व्यवहार किया जाना चाहिए।
कज़
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.