2014-11-17 8 views
7

के लिए निरंतर अभिव्यक्ति का उपयोग करके सरणी घोषित करना मेरे पास एक सरणी के चारों ओर एक नया प्रकार का रैपर है। मुझे लगता है कि मैं चारों ओर सरणी के आकार को मैन्युअल रूप से पास करने के बजाय size_of का उपयोग कर सकता हूं, लेकिन संकलक सोचता है कि मैं गलत हूं।अपने आकार

use std::mem::{size_of, size_of_val}; 

#[repr(C, packed)] 
struct BluetoothAddress([u8, ..6]); 

fn main() { 
    const SIZE: uint = size_of::<BluetoothAddress>(); 

    let bytes = [0u8, ..SIZE]; 
    println!("{} bytes", size_of_val(&bytes)); 
} 

(playpen link)

मैं हर रात को उपयोग कर रहा हूँ: rustc 0.13.0-रात (7e43f419c 2014-11-15 13:22:24 +0000)

इस कोड के साथ विफल निम्न त्रुटि:

:

broken.rs:9:25: 9:29 error: expected constant integer for repeat count, found variable 
broken.rs:9  let bytes = [0u8, ..SIZE]; 
            ^~~~ 
error: aborting due to previous error 

Rust Reference on Array Expressions मुझे लगता है कि यह काम करना चाहिए बनाता है

उत्तर

6

आपकी SIZE परिभाषा कानूनी नहीं है; यह सिर्फ इतना है कि इसमें त्रुटियां सरणी निर्माण पर त्रुटि के बाद होती हैं। आप [0u8, ..SIZE][0u8, ..6] को बदलते हैं तो सिर्फ इतना है कि वह हिस्सा काम करता है हां, तो आप SIZE घोषणा के साथ समस्या नहीं मिलती है:

<anon>:7:24: 7:53 error: function calls in constants are limited to struct and enum constructors [E0015] 
<anon>:7  const SIZE: uint = size_of::<BluetoothAddress>(); 
           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
<anon>:7:24: 7:51 error: paths in constants may only refer to items without type parameters [E0013] 
<anon>:7  const SIZE: uint = size_of::<BluetoothAddress>(); 
           ^~~~~~~~~~~~~~~~~~~~~~~~~~~ 

आप बस वर्तमान में size_of ऐसा फोन नहीं कर सकते हैं।

use std::mem::{size_of, size_of_val}; 

const SIZE: uint = 6; 

#[repr(C, packed)] 
struct BluetoothAddress([u8, ..SIZE]); 

fn main() { 
    let bytes = [0u8, ..SIZE]; 
    println!("{} bytes", size_of_val(&bytes)); 
} 

अपडेट:: जंग 1.0 के साथ, इस सवाल का प्रभावी रूप से समाप्त कर दिया गया है, और

एक वैकल्पिक चीजों को उलटने के लिए इतना है कि SIZE विहित परिभाषा है और अन्य स्थानों का उपयोग यह है कंपाइलर त्रुटि संदेशों में सुधार किया गया है ताकि वे और भी स्पष्ट हो।

इसके अलावा, #42859 हाल ही में उतरा साथ, हर रात को rustc एक निरंतर संदर्भ में size_of का उपयोग कर की अनुमति देगा प्रदान की टोकरा #![feature(const_fn)] (और जब #43017 भूमि, कि किसी भी अधिक या तो की आवश्यकता नहीं होगी है, और फिर इसे करने के लिए के माध्यम से फिल्टर करेगा स्थिर)।

दूसरे शब्दों में, भाषा में सुधार ने अब यह कोई मुद्दा नहीं बनाया है।

+1

क्या एक आकार के निर्माण के लिए कोई आरएफसी या गिटहब मुद्दा है जो संकलन समय पर काम करता है? – rraval

+1

@rraval: सामान्य रूप से संकलन-समय फ़ंक्शन मूल्यांकन की इच्छा है, हालांकि यह 1.0 के लिए कुछ नहीं है जो अब के लिए केंद्रित है। जबकि 'size_of' विशेष-आधारित हो सकता है, यह शायद इसके लायक नहीं हो सकता है। –

+0

यहां इसके लिए एक सीमित आरएफसी है, लेकिन यह काफी नंगे है: https://github.com/rust-lang/rfcs/issues/322 – Quartz

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