0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Effective-Rustlings-jp】Day 14:リフレクションを避けよう

Last updated at Posted at 2025-01-19

はじめに

こんにちは。細々とプログラミングをしているsotanengelです。
この記事は以下の記事の連載です。

他の連載記事 (詳細)

また本記事はEffective Rust(David Drysdale (著), 中田 秀基 (翻訳))を参考に作成されております。とてもいい書籍ですので興味を持った方は、ぜひ読んでみてください!

今日の内容

概要

Rustにはリフレクション(アイテムの型や内容を出力する行為)の一部をサポートしていませんが、他の機能でカバーすることができます。その方法について学びましょう。

グローバルにユニークなIDを取得しよう

問(リンク)

Anyトレイトの機能を使って、グローバルに固有なIDを取得しましょう。

コード (詳細)
use std::any::Any;

// TODO: TにAnyトレイト境界を設けて、グローバルにユニークな識別子(数値)を出力するようにしてください。
fn print_type_id<T>(value: &T) {
    let type_id;
    let type_id = println!("The TypeId of the value is: {:?}", type_id);
}

fn main() {
    let value1 = 42;
    let value2 = "Hello, Rust!";
    let value3 = 3.14;

    print_type_id(&value1);
    print_type_id(&value2);
    print_type_id(&value3);
}

解答(リンク)

コード参照。
ただし、Anyを使った方法ではTが'staticではない生存期間でない参照を含んでいると、Tに対して実装されない。
※生存期間≒型の一部のため

コード (詳細)
use std::any::Any;

fn print_type_id<T: Any>(value: &T) {
    let type_id = value.type_id();
    println!("The TypeId of the value is: {:?}", type_id);
}

fn main() {
    let value1 = 42;
    let value2 = "Hello, Rust!";
    let value3 = 2.468;

    print_type_id(&value1);
    print_type_id(&value2);
    print_type_id(&value3);
}

さいごに

もしも本リポジトリで不備などあれば、リポジトリのissueやPRなどでご指摘いただければと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?