Syntax zum Deklarieren eines Array-Typs mit variabler Größe (zur Kompilierungszeit bekannt)?

1
Ultrasaurus 2019-10-12 06:26.

Ich möchte eine Struktur mit einem Byte-Array erstellen, wobei eine bestimmte Instanz je nach Erstellung der zur Kompilierungszeit bekannten Struktur unterschiedliche Größen haben kann.

Ich habe ein erfundenes Beispiel mit einer Struktur erstellt, die eine Byte-Darstellung einer Gleitkommazahl mit einem separaten Typfeld enthält. Die Arbeitsimplementierung unten:

#![feature(float_to_from_bytes)]

#[derive(Debug)]
enum TypeMarker {
    NUMBER = 0x00,  // f64
    // BOOLEAN: u8 = 0x01, // bool
    // STRING: u8 = 0x02,  // UTF-8 string
}

#[derive(Debug)]
struct Value {
    t: TypeMarker,
    bytes: [u8; 8]
}

impl From<f64> for Value {
    fn from(v: f64) -> Self {
        Value {
            t: TypeMarker::NUMBER,
            bytes: v.to_be_bytes()
        }
    }
}

fn main() {
  let num = 4.0;
  println!("num = {:?}", num);

  let v1 = Value::from(4.0);
  println!("Value::from(4.0) = {:?}", v1);

  let v2:Value = num.into();
  println!("num.into() = {:?}", v2);

}

In diesem Arbeitsbeispiel (siehe auch Repo auf Github ) wird jede Nacht Rost verwendet.

Beispiel ausführen ... cargo +nightly run --example into

produziert das Ergebnis, das ich erwarte:

num = 4.0
Value::from(4.0) = Value { t: NUMBER, bytes: [64, 16, 0, 0, 0, 0, 0, 0] }
num.into() = Value { t: NUMBER, bytes: [64, 16, 0, 0, 0, 0, 0, 0] }

Ich möchte jedoch verschiedene Arten von Zahlen unterstützen, bei denen die Größe zur Kompilierungszeit bekannt ist. Um diese Frage zu veranschaulichen, fügt das folgende Beispiel hinzu impl From<i32>(das 4 Bytes lang ist):

#![feature(float_to_from_bytes)]

#[derive(Debug)]
enum TypeMarker {
    NUMBER = 0x00,  // f64
    // BOOLEAN: u8 = 0x01, // bool
    // STRING: u8 = 0x02,  // UTF-8 string
}

#[derive(Debug)]
struct Value {
    t: TypeMarker,
    bytes: [u8; 8]
}

impl From<f64> for Value {
    fn from(v: f64) -> Self {
        Value {
            t: TypeMarker::NUMBER,
            bytes: v.to_be_bytes()
        }
    }
}

impl From<i32> for Value {
    fn from(v: i32) -> Self {
        Value {
            t: TypeMarker::NUMBER,
            bytes: v.to_be_bytes()
        }
    }
}


fn main() {
  let num = 4.0;
  println!("num = {:?}", num);

  let v1 = Value::from(4.0);
  println!("Value::from(4.0) = {:?}", v1);

  let v2:Value = num.into();
  println!("num.into() = {:?}", v2);

}

Dies erzeugt den folgenden Fehler

error[E0308]: mismatched types
  --> examples/into.rs:33:20
   |
33 |             bytes: v.to_be_bytes()
   |                    ^^^^^^^^^^^^^^^ expected an array with a fixed size of 8 elements, found one with 4 elements
   |
   = note: expected type `[u8; 8]`
              found type `[u8; 4]`

Ich möchte Valuestruct deklarieren, damit es mit Arrays von Bytes variabler Größe erstellt werden kann (wobei die Größe zur Kompilierungszeit bekannt ist).

Ich habe es versucht:

struct Value {
    t: TypeMarker,
    bytes: [u8; usize]
}
error[E0423]: expected value, found builtin type `usize`
  --> examples/into.rs:17:17
   |
17 |     bytes: [u8; usize]
   |                 ^^^^^ not a value

error[E0277]: arrays only have std trait implementations for lengths 0..=32
  --> examples/into.rs:17:5
   |
17 |     bytes: [u8; usize]
   |     ^^^^^^^^^^^^^^^^^^ the trait `std::array::LengthAtMost32` is not implemented for `[u8; _]`
   |
   = note: required because of the requirements on the impl of `std::fmt::Debug` for `[u8; _]`
   = note: required because of the requirements on the impl of `std::fmt::Debug` for `&[u8; _]`
   = note: required for the cast to the object type `dyn std::fmt::Debug`

Also habe ich versucht:

struct Value {
    t: TypeMarker,
    bytes: [u8; _]
}

das hat auch nicht funktioniert:

error: expected expression, found reserved identifier `_`
  --> examples/into.rs:17:17
   |
17 |     bytes: [u8; _]
   |                 ^ expected expression

error: aborting due to previous error

Dies scheint möglich zu sein und ich denke, ich habe die Syntax dafür einmal gelesen, aber ich habe viele Abschnitte des Rust-Buches erneut gelesen und mir Dutzende anderer Beiträge angesehen und kann das nicht ganz herausfinden Syntax.

Frage: Wie kann die bytesDeklaration geändert werden , um das obige Beispiel zu beheben, das den Fehler veranschaulicht? Und wenn dies nicht unterstützt oder nicht idiomatisch ist, welcher Ansatz würde funktionieren?

1 answers

2
Joel Macaluso 2019-10-12 07:18.

Arrays werden auf dem Stapel zugewiesen, sodass es viel einfacher ist, mithilfe des Heaps eine Struktur mit dieser Eigenschaft zu erstellen.

Mein Vorschlag ist, entweder einen Vec für das Byte-Feld zu verwenden

#[derive(Debug)]
struct Value {
    t: TypeMarker,
    bytes: Vec<u8>
}

oder um ein Box-Array zu verwenden:

#![feature(float_to_from_bytes)]

use std::boxed::Box;

#[derive(Debug)]
enum TypeMarker {
    NUMBER = 0x00,  // f64
    // BOOLEAN: u8 = 0x01, // bool
    // STRING: u8 = 0x02,  // UTF-8 string
}

#[derive(Debug)]
struct Value {
    t: TypeMarker,
    bytes: Box<[u8]>,
}

impl From<f64> for Value{
    fn from(v: f64) -> Self {
        Value {
            t: TypeMarker::NUMBER,
            bytes: Box::new(v.to_be_bytes()),
        }
    }
}

impl From<i32> for Value{
    fn from(v: i32) -> Self {
        Value {
            t: TypeMarker::NUMBER,
            bytes: Box::new(v.to_be_bytes()),
        }
    }
}


fn main() {
  let num = 4.0;
  println!("num = {:?}", num);

  let v1 = Value::from(4.0);
  println!("Value::from(4.0) = {:?}", v1);

  let v2:Value = num.into();
  println!("num.into() = {:?}", v2);

}

Weitere Informationen zur Verwendung von Typen mit dynamischer Größe finden Sie hier .

Hoffe das hilft! Viel Glück!

Related questions

MORE COOL STUFF

Cate Blanchett schlief nach 3 gemeinsamen Tagen mit ihrem Ehemann und ist 25 Jahre später immer noch mit ihm verheiratet

Cate Blanchett schlief nach 3 gemeinsamen Tagen mit ihrem Ehemann und ist 25 Jahre später immer noch mit ihm verheiratet

Cate Blanchett widersetzte sich typischen Dating-Ratschlägen, als sie ihren Ehemann traf.

Warum Michael Sheen ein gemeinnütziger Schauspieler ist

Warum Michael Sheen ein gemeinnütziger Schauspieler ist

Michael Sheen ist ein gemeinnütziger Schauspieler, aber was genau bedeutet das?

Hallmark-Star Colin Egglesfield sorgt für spannende Fan-Begegnungen bei RomaDrama Live! [Exklusiv]

Hallmark-Star Colin Egglesfield sorgt für spannende Fan-Begegnungen bei RomaDrama Live! [Exklusiv]

Hallmark-Star Colin Egglesfield sprach über spannende Fan-Begegnungen bei RomaDrama Live! plus sein INSPIRE-Programm auf der Convention.

Warum Sie „Northern Exposure“ nicht online streamen können

Warum Sie „Northern Exposure“ nicht online streamen können

Sie müssen einen Blu-ray- oder DVD-Player abstauben, um zu sehen, warum Northern Exposure zu einer der beliebtesten Shows der 90er Jahre wurde.

Where in the World Are You? Take our GeoGuesser Quiz

Where in the World Are You? Take our GeoGuesser Quiz

The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!

Werfen Sie diese Pappröhren nicht weg! 10 Möglichkeiten, sie wiederzuverwenden

Werfen Sie diese Pappröhren nicht weg! 10 Möglichkeiten, sie wiederzuverwenden

Werfen Sie Ihr Papierhandtuch, Toilettenpapier und Geschenkpapierrollen nicht in den Müll. Geben Sie ihnen stattdessen mit einem dieser 10 Hacks ein zweites Leben.

Schlafen Fische?

Schlafen Fische?

Es ist schwer vorstellbar, dass Nemo im Great Barrier Reef ein paar Zs fängt. Aber Fische brauchen Ruhe. Schlafen sie so wie wir?

Spenden Sie Ihr Haar, um unser Wasser sauber zu halten

Spenden Sie Ihr Haar, um unser Wasser sauber zu halten

Haarteile aus Salons und persönliche Spenden können als Matten wiederverwendet werden, die Ölverschmutzungen aufsaugen und zum Schutz der Umwelt beitragen.

Welche Utility-Apps installieren Sie auf jedem neuen Computer?

Welche Utility-Apps installieren Sie auf jedem neuen Computer?

Foto von Ade Olu Eletu /nappy Es gibt ein paar Programme, die jeder kennt, um sie einem neuen Computer hinzuzufügen: Chrome, Spotify, Dropbox, einige Arbeits-Apps wie Excel oder Photoshop. Aber viele von uns haben auch unsere bevorzugten Hilfs-Apps und Dienstprogramme, um unseren Workflow anzupassen.

Jugend-Hockey-Trainer gefeuert für völlig verdammte Bonkers Pregame Rant

Jugend-Hockey-Trainer gefeuert für völlig verdammte Bonkers Pregame Rant

Bild über Spittin 'Chiclets / Facebook Die Littleton Hockey Association hat einen Trainer aus ihrem Bantam-Reiseteam entfernt, nachdem in den sozialen Medien ein Video aufgetaucht ist, das nur als eines der unglaublichsten und ungehindertesten Motivations-Rants vor dem Spiel in der Geschichte des Jugendhockeys bezeichnet werden kann. Hockey und in der Tat Sport: „Du wirst sie drei schlagen - keine! Ich will sehen, wie du deine Hände in die Ärsche dieser Jungs steckst und sie wie eine verdammte Marionette arbeitest! “ Ein Tippgeber leitete eine E-Mail von Brian TenEyck, Director of Hockey Operations bei Littleton Youth Hockey, an die Eltern weiter und erläuterte die offizielle Antwort auf das Video: Ich kann nur davon ausgehen, dass die Littleton Hawks dieses Spiel mit 998-0 gewonnen haben.

Ihre lächerlich tollen Porsche 911 und Aston Martin DB11 Wallpaper sind da

Ihre lächerlich tollen Porsche 911 und Aston Martin DB11 Wallpaper sind da

Wir freuen uns, wenn Ihre Leser uns Ihre Weekend Wallpaper-Beiträge senden. Aber Sie haben uns in letzter Zeit zu viele verdammte BMWs geschickt! Hör zu, Freund, ich bin super froh, dass du deinen M4 genießt.

So erstellen Sie einen Globus von Grund auf neu

So erstellen Sie einen Globus von Grund auf neu

Zeit, Geduld, Zeit, Engagement und Zeit sind nur einige der Dinge, die Peter Bellerby brauchte, um Bellerby & Co. Globemakers zu gründen und anschließend zu betreiben, eines der wenigen Unternehmen auf der Erde, das noch Globen von Hand herstellt.

Tudor Dixon gewinnt Michigan GOP Primary und trifft nun auf die amtierende Demokratin Gretchen Whitmer

Tudor Dixon gewinnt Michigan GOP Primary und trifft nun auf die amtierende Demokratin Gretchen Whitmer

Tudor Dixon hat am Dienstag die Vorwahlen von Michigan zum Gouverneur gewonnen, nachdem er eine späte Bestätigung des ehemaligen Präsidenten Donald Trump erhalten hatte

Nicky Hilton Forced to Borrow Paris' 'I Love Paris' Sweatshirt After 'Airline Loses All [My] Luggage'

Nicky Hilton Forced to Borrow Paris' 'I Love Paris' Sweatshirt After 'Airline Loses All [My] Luggage'

Nicky Hilton Rothschild's luggage got lost, but luckily she has an incredible closet to shop: Sister Paris Hilton's!

Kate Middleton verbringt einen Tag am Wasser in London, plus Jennifer Lopez, Julianne Hough und mehr

Kate Middleton verbringt einen Tag am Wasser in London, plus Jennifer Lopez, Julianne Hough und mehr

Kate Middleton verbringt einen Tag am Wasser in London, plus Jennifer Lopez, Julianne Hough und mehr. Von Hollywood bis New York und überall dazwischen, sehen Sie, was Ihre Lieblingsstars vorhaben!

17-Jähriger erstochen, während 4 weitere bei einem Messerangriff am Wisconsin River verwundet wurden

17-Jähriger erstochen, während 4 weitere bei einem Messerangriff am Wisconsin River verwundet wurden

Die Ermittler prüfen, ob sich die Gruppe und der Verdächtige vor dem Angriff kannten

-11 聯軍 國 聯軍 - 台灣 還沒 能 有 太陽

-11 聯軍 國 聯軍 - 台灣 還沒 能 有 太陽

2 練習 part2- 沒 沒 的 台灣 x 日本 x 德國 x 奧地利.

Start- und Landebahnen

Start- und Landebahnen

Spätsommer und Herbst sind nostalgische Jahreszeiten. Straßenlaternen werfen ihr Licht über regennasse Straßen, und die Blätter unter den Füßen – gedämpft rot-orange im Schatten der Dämmerung – erinnern an vergangene Tage.

Stellen Sie sich vor, Sie erstellen eine Inhaltsstrategie, die tatsächlich KONVERTIERT. Es ist möglich.

Stellen Sie sich vor, Sie erstellen eine Inhaltsstrategie, die tatsächlich KONVERTIERT. Es ist möglich.

Im Jahr 2021 ermutige ich Sie, alles zu überdenken, was Sie über die Kunden, die Sie bedienen, und die Geschichten, die Sie ihnen erzählen, wissen. Zurücktreten.

Ein Mammutverlust öffnete mein Herz für die Liebe

Ein Mammutverlust öffnete mein Herz für die Liebe

Am Tag des 9. Geburtstags von Felix The Cat erinnere ich mich an einen der größten Verluste meines Erwachsenenlebens – meine Sophie im Jahr 2013. Ich habe diesen Essay geschrieben und ihn kurz im Jahr 2013 auf dieser Plattform geteilt.

Language