🦀

Ruby経験者がRustを触って比較してみた 2020冬

2021/02/10に公開

少し前になりますが、お世話になっていた職場で新しい技術に触れさせて頂ける機会を頂いので、Rustを使ってみました。RustはRubyと世界観が似ていて、理解しやすい部分も多くありました。

今回は、Ruby/Railsの世界と比較して、やったことをまとめてみようと思います。

Rustのいいところ

そもそもなぜRustに興味を持ち、使ってみようと思ったのか。
Rust公式

  • コンパイル型言語のメリット
    • 使ってみた感想を後述
  • パフォーマンスが良い
    • 使ってみた感想を後述
  • 並列処理
    • 今回はたどり着けず
  • Web Assembly
    • 調べてみると、Rustだけではなく他言語も対応していてあまり興味をひかれず、対象外
  • CLIツール
    • 簡単に作れて配布が楽。
    • 使ってみた感想を後述

Rustを書いてみる

Rust のチュートリアル(The book)を読んで、Guessing gameという例題をプログラミングしました。

感想

  • 所有権で、変数のスコープ・ライフサイクルをより厳密に管理できる
    • 保守的にプログラミングすると自然に書けて、ケアレスミスを防いでくれるガイドのよう
  • C言語/C++、C#、Rubyっぽさもあり、バックグラウンドがあれば文法はそれほど難しくない
  • コンパイルすると、参照や定義がきちんと追跡できる。実装にも役立つし、読むのにも良い
  • Rubyみたいなダックタイピングでゆるふわコーディングはできないので、なれるまでコンパイルエラーは増えそう
  • buildしたものを実行するだけなら光速
  • 実行は速いが、バイナリのファイルサイズは大きくなる
  • 個人的には結構好き

Rubyとの用語比較

Rubyがわかれば、これを見ればイメージつかめると思います。Gemに関連する使い勝手も結構似ていて使いやすいと思いました。

Ruby Rust
Gem Crate
Bundler Cargo
Class Struct
インスタンスメソッド メソッド
Array 配列、Vecなど
Hash HashMapなど
array.each for x in array

APIサーバーの実装をRailsと比較する

簡単な例に習って、Rest APIサーバーを PostgreSQLで実装しました
https://github.com/Samemura/rust-web-api-with-db

感想

  • 小規模なら全然あり
  • buildや実行が速い。と思う
    • Railsみたいにライブラリが重くないからというのもありそう
  • アーキテクチャに熱い人は使い勝手が良さそう
  • テストしやすさは、評価できず

Railsとの比較

今回は、公式を見てRocketを使ってみた。後から教えてもらったが、実際に普及しているのはActix-webらしい。以降はRocketとRailsの比較。

項目 Rails Rocket
ORM ActiveRecord Diesel

ただし、DBによってライブラリを使い分ける必要がある。DieselはPostgreSQLとMySQL, SQLiteのみ。
ディレクトリ構成 厳格に決められている 自由

アーキテクチャやレイヤー構成を自分たちで決めて運用する必要がある
Routing routes.rbにDSLで記述 rocketをマウントする際に、controller的 functionを渡す
functionのattribute(プリプロセッサのようなもの)でパスを定義
Controller Controller クラスで実装 functionで実装。特に制限はなし
リクエストのパラメータは、Structを定義してparseする。parseはいい感じやってくれるので結構簡単。
Model Modelクラスで実装 Structで実装。特に制限はなし
ORMしたものとは別に、insert時に使うモデルやselectで取得したものを分けて扱える。
ActiveModelがいっぱいある感じ。似たようなものが増えそうだが、影響範囲が明確なので保守性は良さそう
Migration DSLで記述 Up/Downを分けてSQLを記述

SQLで書いた方が分かりやすい気がする。Up/Downも明確。

CLIツールを作ってみた

簡単に作れるとのことで、身近に使えるものが思いついたので作ってみた。
発表順などでランダムに順番決めるときに使える。
https://github.com/Samemura/kaiten-sushi

感想

  • crates.ioに公開するまではとても簡単にできた
    • 手順はこちら
    • インストールする人はcargo 使えば簡単に導入できる
  • バイナリを直接インストールする方法は結構大変だった
    • 手順に載っているので、軽くできそうで試してみる
    • TravisCI でプラットフォームごとにビルドして、Trustというライブラリのinstall.sh でインストールできるようにする必要がある
      • TravisCIでビルドするけど、デプロイタスクが失敗
      • macosはTrustでサポートされてない
      • 詰んだ?
    • ローカルでビルドすれば mac osのバイナリを作れる
      • Trustのinstall.shは GitHubのReleaseの最新版をの添付ファイルをプラットフォームに応じて取ってくる
      • TravisCIのスクリプト例を参考に、名前付け・アップロード
    • 結構大変だったけど、なんとかできた
    • 確かにCargoなしでもインストールは楽にできる
    • 後から検証してみると、rustcは必要っぽい。
  • CLIを作るのにライブラリのインターフェースは向いてるので、作りやすかった
  • npmでも使えるし、 Rubyからコールすることもできるので将来性ある(Routie)

まとめ

かなり雑なまとめではあるものの、Ruby経験者が雰囲気掴むのには良いかと思います。Trustでのインストールのあたりは、確かな情報があれば教えてもらえるとありがたいです。

英語情報の日本語化は結構されているけど、コミュニティーが英語メインのようで細かい情報はそちらを探す必要がありそうでした。

Discussion