2017-05-29 8 views
7

निम्नलिखित कोड तुच्छ और स्पष्ट प्रतीत होता है (Playground):संकलक पार्स "एक यू 32 <बी" या समान क्यों नहीं हो सकता है?

let a: u16 = 5; 
let b: u32 = 10; 

let c = a as u32 < b; 

अभी तक (2017/05/30) के रूप में संकलक एक वाक्य रचना त्रुटि के साथ विफल:

error: expected one of `!`, `(`, `+`, `,`, `::`, `<`, or `>`, found `;` 
--> src/main.rs:6:25 
    | 
6 |  let c = a as u32 < b; 
    |   

क्या गलत है कंपाइलर के साथ?

उत्तर

12

नोट: नवीनतम जंग compilers अब एक अधिक उपयोगी त्रुटि संदेश (#42578) प्रदान करते हैं:

error: `<` is interpreted as a start of generic arguments for `u32`, not a comparison 
--> src/main.rs:6:22 
    | 
6 |  let c = a as u32 < b; 
    |    --------^-- interpreted as generic arguments 
    |    |  | 
    |    |  not interpreted as comparison 
    |    help: try comparing the casted value: `(a as u32)` 

यह एक ज्ञात संकलक मुद्दा (#22644) है। सीधे शब्दों में कहें, क्योंकि एक प्रकार (u32) < के बाद, संकलक ने टाइप पैरामीटर सूची की शुरुआत के रूप में < को पार्स करने का प्रयास किया। इसलिए, संकलक u32 <b> जैसे कुछ की अपेक्षा कर रहा था, जो वाक्य रचनात्मक रूप से मान्य होगा, भले ही यह समझ में न आए। हालांकि, एक उदाहरण जो पूरी तरह से मान्य जंग बनाता है foo as Rc <fmt::Debug> है, और यदि सिंटैक्स < ऑपरेटर से कम बनाने के लिए बहुत उत्सुक था, तो यह वही असफल हो जाएगा।

बेशक, तकनीकी रूप से इसके आसपास के तरीके हैं: सी ++ और सी # की शुरुआत से ही एक ही अस्पष्टता है, उनके पास कुछ ऐसे तंत्र होते हैं जो इन मामलों को असंबद्ध करते हैं (जैसे कि टोकन की मनमानी संख्या के लिए आगे देखो) हालांकि, पार्सर को और अधिक जटिल बनाते हैं। जंग में उन तंत्रों को शामिल करने से सिंटैक्स (या शायद केवल जंग-सिंटैक्स क्रेट) में परिवर्तन तोड़ने का कारण बन सकता है।

वर्तमान में इस समस्या, एक काफी सरल और दीर्घकालिक समाधान कोष्ठकों के आसपास डाली रैप करने के लिए है पता करने के लिए कोई सक्रिय चर्चा होती है के रूप में:

let c = (a as u32) < b; 
संबंधित मुद्दे