ゆずめも

メモ的なブログです。主に勉強した事について書いてます。

言語処理100本ノック for Rust始めました

Rust書きたい欲はあるのに、いい感じの題材がなかったので言語処理100本ノックをやり始めました

1日1問ペースなのでまだ3問目までしかやってないけど

github.com

www.cl.ecei.tohoku.ac.jp

Rust力低すぎて全然コンパイル通らないから、すごい苦戦してるけど、ちょっとずつやっていく。

とりあえず直近の課題はよくわかってないのでRust的に糞なコード書いてても自分では全く気づけ無い所だな…

Rustの配列操作

大抵の言語で配列やリストだったりを操作することが多いので、新しい言語をやるたびに毎回そこらへんをまず調べるようにしてるのでRustでも調べてみる

ちな過去記事

c#

yuzu441.hateblo.jp

python

yuzu441.hateblo.jp

本題

とりあえずc#でもやった以下の4つを調べる

  • foreach
  • filter
  • map
  • reduce(fold)

foreach

let range = 0..10;
range.for_each(|v| println!("{}", v));
// => 0
// => 1
// => 2
// ~ 以下略 ~

複数行書く場合はfilterの複数行パターン参考にすると書ける

filter

1行で書く場合はこんな感じらしい

let range = 0..10;
let result = range.filter(|v| v % 2 == 0);
for v in result {
    println!("{}", v);
}
// => 0
// => 2
// => 4
// => 6
// => 8

複数行書くときはこう

let range = 0..10;
let result = range.filter(|v| {
  let twice_val = v * 2;
  return twice_val > 10;
});
for v in result {
    println!("{}", v);
}
// => 6
// => 7
// => 8
// => 9

map

let range = 0..10;
let result = range.map(|v| v * 2);
for v in result {
    println!("{}", v);
}
// => 0
// => 2
// => 4
// => 6
// => 8
// => 10
// => 12
// => 14
// => 16
// => 18

reduce(fold)

javascript脳なのでreduceだと思ったけど、foldなんだな

let range = 0..10;
let result = x.fold(0, |acc, v| acc + v);
println!("{}", result);
// => 45

まとめ

公式見ながらやってたんですけど、RustはJavascriptとかと違ってFilterMapとかFlatMapとか色々あって便利でいいな(javascriptだと自分で書くかlodashみたいなの入れないといけない)

doc.rust-lang.org

Rustでfizzbuzz

Rustを勉強しようと思ったけど、何からするか思いつかなかったので、とりあえずFizzBuzzやってみた

適当にcargo newした

project自体はcargo newで作った

自分で書いたもの

雰囲気でRustを書いたらこんな感じ

fn main() {
    let list = 1..31;
    for x in list {
        println!("{}", fizzbuzz(x));
    }
}

fn fizzbuzz(v: i32) -> String {
    match v {
        v if v % 15 == 0 => "FizzBuzz".to_string(),
        v if v % 3 == 0 => "Fizz".to_string(),
        v if v % 5 == 0 => "Buzz".to_string(),
        _ => v.to_string()
    }
}

自分が仕事だったりで使う言語はmatch式ないのでやっぱmatch式あるのはいいなーと思った

関係ないけどRustよりもまだ仕事で使えそうなScalaとかも一緒に勉強してる
ちなみによくわからんかったので、とりあえず去年のscala関西で言ってたAkka本買ったので春休みにでもやりたいですね(そんなものは社畜には)

Akka実践バイブル アクターモデルによる並行・分散システムの実現

Akka実践バイブル アクターモデルによる並行・分散システムの実現

頭いいなーと思った実装

自分で書いたあとに、みんなどんな感じで書いてるのか気になって人の見て
別にあれなハックとかじゃなくて、見やすくていいなーと思った実装

proshunsuke.hatenablog.com

fn fizzbuzz(v: i32) -> String {
    match (v % 3, v % 5) {
        (0, 0) => "FizzBuzz".to_string(),
        (_, 0) => "Fizz".to_string(),
        (0, _) => "Buzz".to_string(),
        _ => v.to_string()
    }
}

matchってこんなふうにマッチングできるんですね

これから

Aizu online judgeとかをRustでできるところまでになりたいな~という気持ち(向いてる向いてないは聞いてない)
Scalaでやるのも楽しそうだけど、Scalaはwebアプリケーション書くために覚えたい