2017-03-13 7 views
1

Vec<String>をコードで再利用できるいくつかの設定で初期化しようとしています。静的const Vecを作成する<String>

私はconst left: Vec<String> = vec![...を使用していますが、これは動作しません:

error[E0308]: mismatched types 
    --> names-generator.rs:2:27 
    | 
2 | const left: Vec<String> = vec![ 
    |       ^expected slice, found array of 93 elements 
    | 
    = note: expected type `Box<[std::string::String]>` 
    = note: found type `Box<[&str; 93]>` 
    = note: this error originates in a macro outside of the current crate 

このような何かを行うための推奨方法は何ですか?

更新: これは重複としてどのようにマークされていますかわかりません。 2つの関連する質問は無関係です。

+0

文字列リテラルの型は '& 'static str'であり、' String'ではありません。 'String'はヒープ上の文字列です。 – glebm

+0

これらは無関係ではありません。実際、彼らは強く関係しています。 'Vec' *または*' String'を作る**唯一の方法**はそれぞれがヒープ割り当てを必要とするため、実行時です。 'Vec'や' String'のようなランタイム値の単一のインスタンスを持つ唯一の方法は、 'InitOnce'や' lazy_static! 'のような何らかのメカニズムによるものです。 – Shepmaster

+0

答えは私のために働いており、私はそれらのどれも使用していません。 – simao

答えて

3

変更可能にしますか?ない場合は、単にアレイを使用することができ、例えば:

const LEFT: [&'static str; 3] = ["Hello", "World", "!"]; 
# or 
const LEFT: &'static [&'static str] = &["Hello", "World", "!"]; 

const Sは、それらが使用されている限り、基本的にコピーされるので、第2の形態は、アレイのサイズに応じて好ましいかもしれません。

+0

配列がかなり大きいです。おそらく私はどこにでもコピーしたくないのです。まだその署名を理解しようとしています。 Thanks – simao

+1

最初のものは静的な文字列への3つの参照の配列です。もう1つは静的な文字列への参照の静的な配列への参照です。静的とは、プログラムの存続期間=存続期間を意味するので、実行可能ファイルのDATAセクションに格納されているものを効果的に処理します。配列に93要素があることがわかります.93個の64ビットポインタがCPUキャッシュラインよりも小さいので、最初のシグネチャが実際には高速で、ベンチマークの価値があります。 – glebm

関連する問題