2016-01-21 13 views
5

जब निम्नलिखित कोड संकलन:f32 के लिए घटाव लागू नहीं किया गया है?

use std::io::*; 

fn main(){ 
    let reader = stdin(); 
    let nums = reader.lock() 
     .lines().next().unwrap().unwrap() 
     .split_whitespace() 
     .map(|s| s.parse::<i32>().unwrap()) 
     .map(|s| s as f32) 
     .map(|s| (s - 4)/2) 
     .map(|s| s as i32) 
     .collect(); 
} 

मैं एक त्रुटि कह मिलती है:

विशेषता core::ops::Sub<_> प्रकार f32

ऐसा क्यों है के लिए लागू नहीं है?

उत्तर

10

जंगली आदिम प्रकारों में हेरफेर करने की बात आती है तो जंग कुछ अन्य भाषाओं की तुलना में कठोर है। अधिकांश गणित ऑपरेटरों को दोनों तरफ एक ही प्रकार की आवश्यकता होती है (बिट शिफ्ट के अपवाद के साथ, जो usize दाएं हाथ के ऑपरेंड के रूप में अपेक्षा करता है)। जंग स्वचालित रूप से एक आदिम संख्यात्मक प्रकार से दूसरे मानों को नहीं डालेगा: आपको कोड में एक स्पष्ट कलाकार डालना होगा। इस कोड को स्थिति को दर्शाता है:

fn main(){ 
    let a: i32 = 2; 
    let b: i8 = 3; 
    println!("{}", a + b); 
} 

यह निम्न त्रुटियों के साथ संकलित करने के लिए विफल रहता है:

<anon>:4:24: 4:25 error: mismatched types: 
expected `i32`, 
    found `i8` 
(expected i32, 
    found i8) [E0308] 
<anon>:4  println!("{}", a + b); 
           ^
<std macros>:2:25: 2:56 note: in this expansion of format_args! 
<std macros>:3:1: 3:54 note: in this expansion of print! (defined in <std macros>) 
<anon>:4:5: 4:27 note: in this expansion of println! (defined in <std macros>) 
<anon>:4:24: 4:25 help: see the detailed explanation for E0308 
<anon>:4:20: 4:25 error: the trait `core::ops::Add<i8>` is not implemented for the type `i32` [E0277] 
<anon>:4  println!("{}", a + b); 
          ^~~~~ 
<std macros>:2:25: 2:56 note: in this expansion of format_args! 
<std macros>:3:1: 3:54 note: in this expansion of print! (defined in <std macros>) 
<anon>:4:5: 4:27 note: in this expansion of println! (defined in <std macros>) 
<anon>:4:20: 4:25 help: see the detailed explanation for E0277 

आपका स्थिति समान है, लेकिन यह ख़ासियत है कि आप पूर्णांकों और तैरता मिश्रण कर रहे हैं। जंग में, पूर्णांक और फ्लोट अक्षर को संदर्भ के आधार पर एक प्रकार असाइन किया जाता है। यही कारण है कि मैं a से 2 और b से 3 ऊपर सेट कर सकता हूं: 2 हमेशा i32 नहीं है, लेकिन संदर्भ के लिए इसे i32 के रूप में स्पष्ट रूप से टाइप किया गया है।

अपने मामले में, आप f32 से एक पूर्णांक घटाने का प्रयास कर रहे हैं। त्रुटि संदेश Sub<_> का उल्लेख करता है; _4 के प्रकार का प्रतिनिधित्व करता है कि संकलक यह पता लगाने में सक्षम नहीं था।

use std::io::*; 

fn main(){ 
    let reader = stdin(); 
    let nums = reader.lock() 
     .lines().next().unwrap().unwrap() 
     .split_whitespace() 
     .map(|s| s.parse::<i32>().unwrap()) 
     .map(|s| s as f32) 
     .map(|s| (s - 4.0)/2.0) 
     .map(|s| s as i32) 
     .collect::<Vec<_>>(); 
} 
:

समाधान पूर्णांक शाब्दिक बजाय नाव शाब्दिक उपयोग करने के लिए बस है

संबंधित मुद्दे