koizr / interface-like-rs

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Rust でインターフェースっぽいものを使う

dynamic-libstatic-lib という別方式で作られた 2 つのクレートの呼び出し方の違いを比べるためのアプリケーション。 デフォルトでは「ログ出力なし」だが、方式ごとに決められた方法を使うと「ログ出力あり」に変更できる。

トレイトオブジェクトを使う

dynamic-lib クレート がトレイトオブジェクトを使う方式で作られたやつ。

  • トレイトオブジェクトを使っているので動的ディスパッチになってしまい、パフォーマンス的には不利
    • バイナリサイズ的には小さくなるかも(使い方によっては小さくならない)
  • どの実装を使うのかランタイムに決定できる
  • ランタイムに決定できるので、環境変数などによって実装を使い分けることが可能
# ログ出力なし
cargo run

# ログ出力あり
ENV=DEVELOPMENT cargo run

トレイト境界を使う

static-lib クレート はトレイト境界を使う方式で作られたやつ。

  • トレイト境界をつけた型変数を使っているので静的ディスパッチになり、パフォーマンス的には有利
    • 静的にいろんな型を渡している場合バイナリサイズが大きくなる
  • しかし呼び出しの経路全部に型変数がつくので結構邪魔に思う人はいるかも
    • impl Trait を使えば型変数がつくのを抑えられる
  • どの実装を使うのかコンパイルタイムに決定される
  • コンパイルタイムに決定しなければならないので feature フラグと cfg の組み合わせなどで使い分けることが可能
    • profile を取得できればフラグ付けなくても良くなるんだけどやり方がわからない(できるのか?)
# ログ出力なし
cargo run

# ログ出力あり
cargo run --features log

About


Languages

Language:Rust 100.0%