言語処理100本ノック for Rust始めました
Rust書きたい欲はあるのに、いい感じの題材がなかったので言語処理100本ノックをやり始めました
1日1問ペースなのでまだ3問目までしかやってないけど
Rust力低すぎて全然コンパイル通らないから、すごい苦戦してるけど、ちょっとずつやっていく。
とりあえず直近の課題はよくわかってないのでRust的に糞なコード書いてても自分では全く気づけ無い所だな…
Rustの配列操作
大抵の言語で配列やリストだったりを操作することが多いので、新しい言語をやるたびに毎回そこらへんをまず調べるようにしてるのでRustでも調べてみる
ちな過去記事
本題
とりあえず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みたいなの入れないといけない)
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実践バイブル アクターモデルによる並行・分散システムの実現
- 作者: レイモンド・ロステンバーグ,ロブ・バッカー,ロブ・ウィリアムズ,前出祐吾,根来和輝,釘屋二郎
- 出版社/メーカー: 翔泳社
- 発売日: 2017/12/13
- メディア: Kindle版
- この商品を含むブログを見る
頭いいなーと思った実装
自分で書いたあとに、みんなどんな感じで書いてるのか気になって人の見て
別にあれなハックとかじゃなくて、見やすくていいなーと思った実装
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アプリケーション書くために覚えたい