RustKansaiMeetupOsaka#2に参加しました

Rust Kansai Meetup Osaka #2参加しているので感想を書いていきます 参加したので感想を書きました

Rustで学ぶHaskell

actix-webが死んだ…作者が疲れたらしい→https://github.com/actix/actix-web

Haskellは1年前くらいに書籍を読んだけど、崇高すぎて諦めた。

WikipediaいわくRustはHaskellに影響されているらしい

RustとHaskellでの型はi32とかも含めほとんど同じ

Genericsもパターンマッチングもほぼ同じ

Rustでいうenumは、Haskellの場合メイビーモナドというものがあって書き方が結構違う

RustでいうトレイトはHaskellでは型クラス。根本的な違いがあるが両者が相互作用するために見た目は似ているらしい

https://stackoverflow.com/questions/28123453/what-is-the-difference-between-traits-in-rust-and-typeclasses-in-haskell

Rustを関数型言語というかどうかと言う話が出たけど、確かに関数型言語かどうかの基準自体は結構緩そう

計算機科学において、第一級関数(だいいっきゅうかんすう、英: first-class function、ファーストクラスファンクション)[1]とは、関数を第一級オブジェクトとして扱うことのできるプログラミング言語の性質、またはそのような関数のことである。その場合その関数は、型のある言語では function type(en:Function type)などと呼ばれる型を持ち、またその値は関数オブジェクトなどになる。具体的にはプログラムの実行時に生成され、データ構造に含めることができ、他の関数の引数として渡したり、戻り値として返したりすることのできる関数をいう。この概念はメタプログラミングとは異なり、コンパイラ呼び出しやeval関数によって生成された関数は含まれない。無名関数も参照。 https://ja.wikipedia.org/wiki/%E7%AC%AC%E4%B8%80%E7%B4%9A%E9%96%A2%E6%95%B0

思ったこと・調べたこと

actix-webは社内ツールで一度使ったことがあって結構便利だったなぁと思っていたので悲しい 😭

Haskellは遅延評価・GC があるのでそこが決定的に違いそう。

HaskellのGC(正確にはGHCのGC?)は従来のGCよりとても簡素。デフォルトで世代別GCを使うらしい。

https://wiki.haskell.org/GHC/Memory_Management

メイビーモナドをWikiで調べてみたけど、RustでいうOption型に近い?

data Maybe t = Just t | Nothing

https://ja.wikipedia.org/wiki/%E3%83%A2%E3%83%8A%E3%83%89_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0)#Maybe%E3%83%A2%E3%83%8A%E3%83%89

rustlingsとevcxrでRustを学ぶ

rustlings

https://github.com/rust-lang/rustlings

Rustについて学習できるリポジトリ↑

コマンドラインツールのrustlingsを使って、未完成のrustファイルを正しく動くように修正していき、学習するサービス

rustlings watch で変更を検知して再コンパイルしてくれてる

evcxr

https://github.com/google/evcxr

Rustを対話的に実行できるツール。

どうやってやってるか、読んだけど仕組みはよくわからない。 https://qnighy.hatenablog.com/entry/2018/09/29/190000

あまりREPLでやる機会がなかったけどみなさんはPlayGroundを使うことが多いらしい

思ったこと・調べたこと

rustlingsを試してみた。


✅ Successfully compiled exercises/variables/variables1.rs!

🎉 🎉  The code is compiling! 🎉 🎉

You can keep working on this exercise,
or jump into the next one by removing the `I AM NOT DONE` comment:

 7 |  // feel ready for the next exercise, remove the `I AM NOT DONE` comment below.
 8 |  
 9 |  // I AM NOT DONE
10 |  
11 |  fn main() {

終わったら // I AM NOT DONE をコメントアウトしていくらしい

rustlings

急遽 rustlingsをみんなで同時に行うイベントが始まりましたw。

結果、僕は1時間で exercises/test4.rs までクリアしました。その後日も進めて今はstandard_library_typesまでクリアしました。

僕の解答はこちらにpushしています

macroとmoduleを今まで避けてきたためググりまくる羽目になった、が、macroも仕組みはただのパターンパッチングみたい。完全に理解した()

以下、勉強になった問題

exercises/test2.rs

"nice weather".into() は推論してくれるらしい。なぜ??

    string_slice("blue");
    string("red".to_string());
    string(String::from("hi"));
    string("rust is fun!".to_owned());
    // intoはStringも&strも通る。
    string("nice weather".into());
    string(format!("Interpolation {}", "Station"));
    string_slice(&String::from("abc")[0..1]);
    string_slice("  hello there ".trim());
    string("Happy Monday!".to_string().replace("Mon", "Tues"));
    string("mY sHiFt KeY iS sTiCkY".to_lowercase());
exercises/enums/enums3.rs

パターンマッチングの問題。 Message::Move{x, y} の場合だけ {..} と書くのにハマった。エラー内容に書いてあったからきちんとエラーは読まないといけない(戒め

    match message {
        Message::ChangeColor(x, y, z) => {
            self.change_color((x, y, z));
        },
        Message::Move{x, y} => {
            let position = Point {
                x: x,
                y: y
            };
            self.move_position(position);
        },
        Message::Quit => self.quit(),
        _ => println!("#")
    };

See also