Rustさっぱりわからん
Cargo
cargo watch -x run 便利
cargo-watch
cargo-edit
add dependencyしてくれる
cargo add XXXX でパッケージ追加。
Iter / vec / 配列関連
let str = vec!["a","b"]をVec<String>に変換する
str.into_iter().map(|x| x.to_string()).collect();
collectはコンシューマ?
2つのvecの結合
into_iterとiter
配列のmutate渡し
fn some_fn(item: &mut Vec<i32>) だったらsome_fn(&mut val) 的な感じ
map時にindexが欲しい時 -> enumerate
items.iter().enumerate().map(|(i,x)| i * x)
reduce
fold(0, |acc, x| acc + x)
filter + remove => retain
sort
可変長配列
Vec かBox
reverse
vecでiter().rev().collect 的な感じにするのが良いらしい
foldによるsum
let sum: i64 = array.map(|a| a.count ).fold(0, |sum, i| sum + i);
filter_mapからのcollectのとき_で推論させてる?
code:rust
let diff_size: Vec<_> = list
.iter()
.filter_map(|sq| map.get((sq) as usize))
.collect();
_ ->
Ragne
for x in 1..10
(0..n).map(|i| i * i).collect::<Vec<i32>>();
HashMap
get -> Option型で返ってくる
insert -> setではなく
fun
クロージャの定義が可能
code:rust
let sq = |n:i32| {
(1..n).map(|i| (i + 1).pow(2)).rev().collect::<Vec<i32>>() // セミコロンはつけてはいけない
};
move クロージャ
所有権絡み
型
なんかこんな文法がありそう.collect::<Vec<String>>();
code:rust
let c = |s: String| {
s.split_whitespace()
.map(|sp| sp.chars().rev().collect::<String>())
.collect::<Vec<String>>()
.join(" ")
};
つまりこんなんになる
型アノテーション?
let item Vec<_> = some.iter().collect()
type placeholder。推論っぽいことしてくれてる
Pointer
filter_mapをするとcollectが参照になるのはcloneしとけば回避できる
code:rust
let pow: Vec<&i32> = v1
.iter().enumerate().filter_map(|(i, v)| v2.get(i))
.collect();
let pow2: Vec<i32> = v1
.iter().enumerate().filter_map(|(i, v)| v2.get(i))
.map(|d| d.clone())
.collect();
構文
Structのメソッド呼び方
SomeStruct::some_method()
type alias
type NodeRef = Rc<RefCell<TreeNode>>;
'aってなんだっけ
-> ライフタイム
if let
Optionalなtuple使うと複数の値を一気に処理できそう
if let (Some(l1), Some(l2)) = (l1, l2) {
~T == Box<T>
文字列
文字列のsplit - split ?
rsplitはreverseして返ってくる
正規表現は頼れない・・・?
join はjoinでありそう
文字列ループ
str.chars().map(|char| ...)
数値
i32 -> Binary
let b_str = format!("{:b}", n); formatでstring化するしかなさげ
Ref系
Rc / Box / RefCell
Rc<RefCell<T>> => 合成
let foo = if ... { } elseって書ける
mutateしない場合はこれも思い出すこと
Some(ref a) => {
とりあえず困ったらcloneすると回避できることがある
v1.borrow().left.clone()
Optional
replace
foo = Some(5)とfoo.replace(5)は同義?
takeすごい。お前がナンバーワンだ
所有権
Segmentation Faultをコンパイラで検出するためのものだ、と言われたらたしかにそれは滅茶苦茶良いと思えてくる
なんとなくの理解 -> 所有権をなにかに渡す場合、もとのものになにかで埋め合わせをする必要がある
Cargo
cargo watch -x run 便利
cargo add XXXX でパッケージ追加。