Closed17

rustlingsでRustに入門する

akkyakky

slice

slice.rs
 let a = [1, 2, 3, 4, 5];
 let b = &a[1..4];
 assert_eq!([2, 3, 4], b);
akkyakky

Debugトレイト

println!() 的なやつに出力するためには、
fmt::Display を実装するか、deriveアトリビュートを使って簡略化してしまうか(#[derive(Debug)])

akkyakky

struct update syntax

structs.rs
 struct Color {
 	r: u8,
 	g: u8,
 	b: u8
 }
 
 let c = Color{r: 1, g: 1, b: 1};
 let c2 = Color{b: 100, ..c}; // { r: 1, g: 1, b: 100}

分割代入っぽいことができる?

akkyakky

vec

vecのイテレータに対してはdereferenceが必要

vec.rs
 for i in v.iter_mut() {        
 	*i *= 2;
 }
akkyakky

Generics

generics.rs
 struct Wrapper<T> {
     value: T,
 }
 
 impl<T> Wrapper<T> {
     pub fn new(value: T) -> Self {
         Wrapper { value }
     }
 }
generics_write.rs
 // std::fmt::Display を実装している方に制限することで、structをprintできるようにする
 impl<T: std::fmt::Display> ReportCard<T> {
 }
akkyakky

Option型

let Some(x) = hoge みたいな代入文が作れるらしい
入れ子にすることも可能

option.rs
 fn main() {
     let optional_word = Some(String::from("rustlings"));
     // TODO: Make this an if let statement whose value is "Some" type
     if let Some(word) = optional_word {
         println!("The word is: {}", word);
     } else {
         println!("The optional word doesn't contain anything");
     }
 
     let mut optional_integers_vec: Vec<Option<i8>> = Vec::new();
     for x in 1..10 {
         optional_integers_vec.push(Some(x));
     }
 
     // TODO: make this a while let statement - remember that vector.pop also adds another layer of Option<T>
     // You can stack `Option<T>`'s into while let and if let
     while let Some(Some(integer)) = optional_integers_vec.pop() {
         println!("current value: {}", integer);
     }
 }
akkyakky

Arc

変数を共有したいときに使う
例えば、並列計算を行うとき、1つの変数を複数のスレッドで触るときとか

akkyakky

イテレータ

collect() は謎
本当に謎

iterators.rs
 // Complete the function and return a value of the correct type so the test passes.
 // Desired output: Ok([1, 11, 1426, 3])
 fn result_with_list() -> Result<Vec<i32>, DivisionError> {
     let numbers = vec![27, 297, 38502, 81];
     let division_results = numbers.into_iter().map(|n| divide(n, 27));
     let result: Result<Vec<i32>, DivisionError> = division_results.collect();
     result
 }
 
 // Complete the function and return a value of the correct type so the test passes.
 // Desired output: [Ok(1), Ok(11), Ok(1426), Ok(3)]
 fn list_of_results() -> Vec<Result<i32, DivisionError>> {
     let numbers = vec![27, 297, 38502, 81];
     let division_results = numbers.into_iter().map(|n| divide(n, 27));
     let result: Vec<Result<i32, DivisionError>> = division_results.collect();
     result
 }
akkyakky

Thread

並列処理はArcMutex を利用する
変数の値を読み書きするときにlockを取得する
C言語と違い、ミューテックスとそれによって保護される変数が1対1に対応している

Arc::new(Mutex::new( some object ));
akkyakky

Macro

実装する順序が重要らしい

moduleとして公開するときは、#[macro_use] が重要
但し、名前空間は一緒っぽいので名前の衝突に気をつける必要がありそう?

akkyakky

As

異なる型同士で演算を行うことは出来ないので、asとかで型を合わせてあげる必要がある

akkyakky

advanced_error

? を動作させるためには Fromトレイト( From::from ) を実装する必要がある

parse() を動作させるためにはFromStrトレイトを実装する必要がある?(FromStr::from_str())

このスクラップは2022/04/01にクローズされました