Rustに10個の空ベクトルの配列を作成したいが、[Vec::new(); 10]
はを実装していないため、Vec
は機能しません。どのようにすればいいのですか?より一般的に言えば、関数を繰り返し呼び出すことによって配列を初期化するにはどうしたらいいですか?関数を使用して配列を初期化するにはどうすればよいですか?
答えて
これは本当に興味深い質問です。私は考えることができる
唯一の安全な解決策は、私は可能な2は
まず
マクロ
macro_rules! array {
($v: expr; 1) => ([$v]);
($v: expr; 2) => ([$v, $v]);
($v: expr; 3) => ([$v, $v, $v]);
($v: expr; 4) => ([$v, $v, $v, $v]);
($v: expr; 5) => ([$v, $v, $v, $v, $v]);
// until 32
}
let a = array![Vec::new(); 3];
を使用して簡単な解決策に近づく見るこの
ようなマクロです
少し冗長ですが、さらにstandard libはこの種の構造を使用します。
セカンド
私は前に答えていたこの質問とotherとの間の接続を実現した後、私ははそうでないことをを示していることをnodrop
extern crate nodrop;
macro_rules! array {
($e: expr; $n:expr) => (
{
use std::mem;
use std::ptr;
use nodrop::NoDrop;
struct ArrayBuilder<T> {
len: usize,
data: *mut T,
}
impl<T> Drop for ArrayBuilder<T> {
fn drop(&mut self) {
unsafe {
while self.len > 0 {
let offset = (self.len as isize) - 1;
self.len -= 1;
ptr::drop_in_place(self.data.offset(offset));
}
}
}
}
let mut v: NoDrop<[_; $n]> = NoDrop::new(unsafe {
mem::uninitialized()
});
// helps type inference for v
if false { v[0] = $e; }
let mut builder = ArrayBuilder {
len: 0,
data: (&mut *v as *mut _) as *mut _
};
unsafe {
for i in 0..$n {
ptr::write(builder.data.offset(i as isize), $e);
builder.len = i + 1;
}
}
builder.len = 0;
v.into_inner()
}
)
}
let a = array![Vec::new(); 3];
とテストを使用して、このソリューションを書きましたリークメモリ
#[test]
fn test() {
static mut COUNT: usize = 0;
#[derive(Debug)]
struct X(usize);
impl Drop for X {
fn drop(&mut self) {
println!("drop {:?}", self.0);
}
}
impl X {
fn new() -> X {
unsafe {
if COUNT == 3 {
panic!();
}
let x = X(COUNT);
COUNT += 1;
x
}
}
}
array![X::new(); 6];
}
このテストでは、X(3)
を作成するときにパニックが発生するため、X(0)
,X(1)
、X(2)
を削除する必要があります。
その他
危険なソリューションhereがあります。
理論的には、任意のnに対してこのような構成を生成できるマクロを作成することは可能でしょうか?さびのマクロが単一の式に拡張されるというルールによって、私自身の試みが邪魔になり、大カッコ内に可変数の式を持つことが難しくなりました。 – user3519580
現在のマクロシステムでは不可能です。 – malbarbo
- 1. 関数内のポインタの配列のサイズを初期化するにはどうすればよいですか?
- 2. 初期化関数のイベントリスナーにプロトタイプ関数を追加するにはどうすればよいですか?
- 3. 変数を初期化するにはどうすればよいですか?
- 4. cで文字列配列を初期化するにはどうすればよいですか?
- 5. Pythonで2Dリスト/配列の列ベクトルを初期化するにはどうすればよいですか?
- 6. 整数のリストを使用してLLVMの整数配列を初期化するにはどうすればよいですか?
- 7. URLを使用してOutputStreamを初期化するにはどうすればよいですか?
- 8. APIトークンを使用してGithub APIを初期化するにはどうすればよいですか?
- 9. クラスコンストラクタを使用してクラスオブジェクトのフィールドを初期化するにはどうすればよいですか?
- 10. MEFを使用してクラスのグループを初期化するにはどうすればよいですか?
- 11. Guavaを使用して空のImmutableEnumMapを初期化するにはどうすればよいですか?
- 12. ウェブサイトプロジェクトでi18nextプラグインを初期化して使用するにはどうすればよいですか?
- 13. 構造体を指すポインタの配列を初期化するにはどうすればよいですか?
- 14. Javaでこの2D配列をnullで初期化するにはどうすればよいですか?
- 15. コンストラクタパラメータからテンプレートメンバ配列を初期化するにはどうすればよいですか?
- 16. 関数を使用して配列を変更するにはどうすればよいですか?
- 17. Cでこの2D配列を初期化するにはどうすればよいですか?
- 18. Cで多次元配列を初期化するにはどうすればよいですか?
- 19. Verilog-2005で2次元パラメータ配列を初期化するにはどうすればよいですか?
- 20. jqueryの入力クラスで配列を初期化するにはどうすればよいですか?
- 21. C++でオブジェクトの空の配列を初期化するにはどうすればよいですか?
- 22. Connectミドルウェアで非同期初期化を使用するにはどうすればよいですか?
- 23. yiiを使用してデータベースから値を取得してJavaScript配列を初期化するにはどうすればよいですか?
- 24. このポインタの配列を初期化するにはどうすればよいですか?
- 25. TypeScriptのオブジェクトの多次元配列を初期化するにはどうすればよいですか?
- 26. C#拡張関数内で値(== null)を初期化するにはどうすればよいですか?
- 27. ajaxリクエストの成功時にjquery関数を初期化するにはどうすればよいですか?
- 28. Promise.all()を使用して関数内に構築されている配列を返すのを延期するにはどうすればよいですか?
- 29. IKImageViewを初期化するにはどうすればよいですか?
- 30. コンテンツプロバイダを初期化するにはどうすればよいですか?
お試しいただいた内容をお見せできますか?関数やベクトルから配列を返すことは問題ありません。あなたはどちらを試してみましたか? (あなたのタイトルは配列、あなたの質問はベクトルと言います)。 –
よろしくお願いします。それはタイプミスです – user3519580
関連:[デフォルト(構造体値)配列の初期化にはなぜコピーの特性が必要ですか?](http://stackoverflow.com/q/27876588/155423)固定長配列を初期化する適切な方法?](http://stackoverflow.com/q/31360993/155423)。重複しない[非コピー型の大きな固定長配列の初期化](http://stackoverflow.com/q/28656387/155423) – Shepmaster