Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Rust学習 #16

Open
himanoa opened this issue Oct 22, 2019 · 6 comments
Labels

Comments

@himanoa
Copy link
Owner

@himanoa himanoa commented Oct 22, 2019

No description provided.

@himanoa

This comment has been minimized.

Copy link
Owner Author

@himanoa himanoa commented Oct 22, 2019

学習にあたってやること

@himanoa himanoa added the 調査 label Oct 22, 2019
@himanoa

This comment has been minimized.

Copy link
Owner Author

@himanoa himanoa commented Oct 22, 2019

わかってきたこと

  • Borrow Checkerとの戦い方
  • 参照で渡すべきかそのまま渡すか
    • 基本的に関数呼び出し時には参照渡しを行うほうが楽なことが多い
pub fn foo(n: String) -> i32 {
    12
}
pub fn main() {
    let a = String::from("asdasd");
    let b = foo(a);
    println!("{}", a);
    println!("{}", b);
}

引数で実態渡ししまくってると上みたいなコード書いたときにaからbに所有権が移動してコンパイルが落ちてしまうが、基本的に参照で渡すスタイルにすると参照自体は都度作成される(適切な表現ではなさそう)ので、うまいこと動いてくれる

pub fn plus_one(n: &str) -> i32 {
    12
}
pub fn main() {
    let a = String::from("asdasd");
    let b = plus_one(&a);
    println!("{}", a);
    println!("{}", b);
}

ただ逆に参照で受け取って関数内部で作った変数の参照をreturnするとコンパイルが通らない。
これはなんでかというと、Rustはスコープアウトした変数は開放されるので死ぬ。この場合は死んだ変数の参照をreturnしてるので、returnしたあとに変数に触ったときにすでにアクセスされてて死ぬのをコンパイル時に検知するため、コンパイルが通らないらしい。賢い

pub fn foo(n: &str) -> &str {
    format!("{}{}", n, "foo").as_ref()
}
pub fn main() {
    let a = String::from("asdasd");
    let b = foo(&a);
    println!("{}", a);
    println!("{}", b);
}

なので戻り値で返すときは参照じゃなくて基本的に新しいStringオブジェクトを返すとうまく行くと思う

pub fn foo(n: &str) -> String {
    String::from(format!("{}{}", n, "foo"))
}
pub fn main() {
    let a = String::from("asdasd");
    let b = foo(&a);
    println!("{}", a);
    println!("{}", b);
}
  • テストのやり方
    • mod testsを書いてマクロでエイヤした関数を定義しまくって cargo test
    • cargo-watchパッケージを入れといて cargo watch -x test しとくと保存と同時に勝手に回って便利
  • コンパイルエラーの解決方法がわからないとき
    • 下手に検索してQAサイトやフォーラムを見るよりも、出てきたエラーコード(E7016みたいなやつ)のexplainを見るほうが為になる。
    • rustc --explain E7016
  • エラーハンドリング
    • ライブラリ作る側も使う側もとりあえずfailureを使うといい。
    • Result<任意, failure::Error>のI/Fを満たしとけば思考停止で?でなんとかなる。
    • 依存するライブラリがErrorChainだったりBoxstd::error::Errorを要求してくる場合はmap_errで適切にラップした例外に変換するといいっぽい。
    • FYI. https://qiita.com/legokichi/items/d76b6aa5dac2ad781bda
    • エラーバブリングとかはわからん
@himanoa

This comment has been minimized.

Copy link
Owner Author

@himanoa himanoa commented Oct 22, 2019

わからんこと

  • DIのやり方
    • 多分2種類ある
    • 動的ディスパッチで実行時に解決する方法
    • 静的ディスパッチでコンパイル時に解決する方法
  • マルチスレッド
  • イベントループ
  • Future
  • dyn
    • ランタイム時にメモリアロケーションするサイズが決まる??
  • Sync Send
  • Rc
  • RefCell
  • Arc
    • スマポらしい?
@himanoa

This comment has been minimized.

Copy link
Owner Author

@himanoa himanoa commented Oct 24, 2019

mkrepoをリリースした https://github.com/himanoa/mkrepo

@himanoa

This comment has been minimized.

@himanoa

This comment has been minimized.

Copy link
Owner Author

@himanoa himanoa commented Oct 27, 2019

Send + Syncの適切な実装はどういうものなのかがわからないな

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
1 participant
You can’t perform that action at this time.