2014-11-17 7 views
7

Ich habe einen Wrapper newtype um ein Array. Ich nahm an, dass ich size_of verwenden konnte, anstatt die Größe des Arrays manuell zu übergeben, aber der Compiler denkt, dass ich falsch liege.Array mit einem konstanten Ausdruck für seine Größe deklarieren

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)

Ich bin mit dem nächtlichen: rustc 0.13.0-nächtlichen (7e43f419c 2014-11-15 13:22:24 +0000)

Dieser Code schlägt mit der folgende Fehler:

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 

die Rust Reference on Array Expressions lässt mich denken, dass dies funktionieren sollte:

In the [expr ',' ".." expr] form, the expression after the ".." must be a constant expression that can be evaluated at compile time, such as a literal or a static item.

Antwort

6

Ihre SIZE Definition ist nicht zulässig; Es ist nur so, dass die Fehler später als der Fehler bei der Array-Konstruktion auftreten. Wenn Sie [0u8, ..SIZE] zu [0u8, ..6] nur so ändern, dass dieser Teil funktioniert, finden Sie die Probleme mit der SIZE Erklärung:

<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>(); 
           ^~~~~~~~~~~~~~~~~~~~~~~~~~~ 

Sie einfach nicht size_of wie das gegenwärtig anrufen kann.

Eine Alternative ist, die Dinge zu invertieren, so dass SIZE die kanonische Definition ist und die anderen Orte verwenden es:

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)); 
} 

Update: Mit Rust 1.0, diese Frage effektiv verworfen wurde, und Die Compiler-Fehlermeldungen wurden verbessert, so dass sie noch klarer sind.

Außerdem mit #42859 kürzlich gelandet, rustc nächtlichen ermöglicht size_of in einem konstanten Zusammenhang mit, sofern die Kiste hat #![feature(const_fn)] (und wenn #43017 Länder, die auch nicht mehr benötigt werden, und dann wird es filtern durch stabil).

Mit anderen Worten, Verbesserungen der Sprache haben dies zu einem Problem gemacht.

+1

Gibt es ein RFC- oder GitHub-Problem für ein sizeof-Konstrukt, das zur Kompilierzeit funktioniert? – rraval

+1

@rraval: Es gibt einen Wunsch nach Compil-Time Function Evaluation im Allgemeinen, aber das ist nicht etwas für 1.0, das ist der Fokus für jetzt. Während "size_of" könnte speziell sein, könnte es einfach nicht wert sein. –

+0

Hier gibt es eine begrenzte RFC, aber es ist ziemlich nackt: https://github.com/rust-lang/rfcs/issues/322 – Quartz

Verwandte Themen