Vecに型バラバラで突っ込みたい

2021/06/12に公開

配列にですね。色々な型のデータを突っ込みたい。そんな事よくありますよね!(あんまりないけど)

Any使えばいいっぽいよ

どこかで見たらAny使えばいい。みたいなことが書いてありました。

let mut items: Vec<Box<dyn Any>> = Vec::new();
items.push(Box::new("あああああ"));

こんな感じで突っ込むことができます。
取り出すときは例えば・・・

for item in items.iter() {
    if let Some(i) = item.downcast_ref::<&str>() {
	println!("{:?}", i);
    }
}

こんな感じでOKでした。

データを適当に突っ込んで、型指定したらそのデータ取ってきたい

実際のところこういう事がやりたいケースが多そうかなと思います。

fn main() {
    let mut x = Hoge::new();
    x.push(12);
    x.push("pppppppppppppp");
    x.push("kjlk".to_string());
    println!("{:?}", x.get::<String>());
    println!("{:?}", x.get::<i32>());
    println!("{:?}", x.get::<&str>());
    println!("{:?}", x.get::<i64>());
}

結果として

Some("kjlk")
Some(12)
Some("pppppppppppppp")
None

こんな感じに出力されたらいいなぁ的な。

use std::any::Any;
struct Hoge {
    data_list: Vec<Box<dyn Any>> 
}

impl Hoge {
    fn new() -> Self {
        Self {
            data_list: Vec::new()
        }
    }

    fn push<T:'static>(&mut self, data: T) {
        
        self.data_list.push(Box::new(data));
    }

    fn get<T:'static>(&mut self) -> Option<&T> {
        for item in self.data_list.iter() {
            if let Some(i) = item.downcast_ref::<T>() {
                return Some(i);
            }
        }

        None
    }
}

そして作ったのはこんな感じ。
まぁ、コンパイルエラーもでないし、動作もちゃんとできたので大丈夫なのかなぁと。

'static まじわからん

関数、pushやgetで <T:'static> としてるじゃないすか。
なんで'staticなの? しばらく前までは 'static ってプログラム実行時に静的にメモリ配置されているという認識であったんですがどうやら違うらしいですよね(´・ω・`)

今回も 'static ってやってるけどなんで?まじわからん。

rust 初心者過ぎてツライ_| ̄|○

Discussion