Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to create a static array of strings?

Note This question contains syntax that predates Rust 1.0. The code is invalid, but the concepts are still relevant.

How do you create a global static array of strings in Rust?

For integers, this compiles:

static ONE:u8 = 1;
static TWO:u8 = 2;
static ONETWO:[&'static u8, ..2] = [&ONE, &TWO];

But I can't get something similar for strings to compile:

static STRHELLO:&'static str = "Hello";
static STRWORLD:&'static str = "World";
static ARR:[&'static str, ..2] = [STRHELLO,STRWORLD]; // Error: Cannot refer to the interior of another static
like image 305
Andrew Wagner Avatar asked Dec 13 '14 14:12

Andrew Wagner


People also ask

How do you create an array of strings?

The String Array is initialized at the same time as it is declared. You can also initialize the String Array as follows: String[] strArray = new String[3]; strArray[0] = “one”; strArray[1] = “two”; strArray[2] = “three”; Here the String Array is declared first.

How do you declare an array statically?

To declare a statically allocated array, which you do not have to do for this activity, just declare the type of the array elements and indicate that it is an array by putting []s containing the size after the array variable's name. The size of the array must be specified as either an integer or an integer constant.

Can we create a static array in Java?

Java array can also be used as a static field, a local variable, or a method parameter. The size of an array must be specified by int or short value and not long.


4 Answers

This is a stable alternative for Rust 1.0 and every subsequent version:

const BROWSERS: &'static [&'static str] = &["firefox", "chrome"];
like image 85
Quartz Avatar answered Oct 26 '22 07:10

Quartz


There are two related concepts and keywords in Rust: const and static:

https://doc.rust-lang.org/reference/items/constant-items.html

For most use cases, including this one, const is more appropriate, since mutation is not allowed, and the compiler may inline const items.

const STRHELLO:&'static str = "Hello";
const STRWORLD:&'static str = "World";
const ARR:[&'static str, ..2] = [STRHELLO,STRWORLD];

Note, there is some out-of-date documentation out there that doesn't mention the newer const, including Rust by Example.

like image 7
Andrew Wagner Avatar answered Oct 26 '22 07:10

Andrew Wagner


Another way to do it nowadays is:

const A: &'static str = "Apples";
const B: &'static str = "Oranges";
const AB: [&'static str; 2] = [A, B]; // or ["Apples", "Oranges"]
like image 5
Adrian Avatar answered Oct 26 '22 06:10

Adrian


Just used this to allocate a small POC level for a game in Rust

const LEVEL_0: &'static [&'static [i32]] = &[
    &[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
    &[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
    &[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
    &[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
    &[1, 9, 0, 0, 0, 2, 0, 0, 3, 1],
    &[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
    &[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
    &[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
    &[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
    &[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
];

And loaded using the following function

pub fn load_stage(&mut self, ctx: &mut Context, level: usize) {
    let levels = vec![LEVEL_0];

    for (i, row) in levels[level].iter().enumerate() {
        for (j, col) in row.iter().enumerate() {
            if *col == 1 {
                self.board.add_block(
                    ctx,
                    Vector2::<f32>::new(j as f32, i as f32),
                    self.cell_size,
                );
            }
like image 2
Eduardo Pereira Avatar answered Oct 26 '22 05:10

Eduardo Pereira