Closed17
rustlingsでRustに入門する
slice
slice.rs
let a = [1, 2, 3, 4, 5];
let b = &a[1..4];
assert_eq!([2, 3, 4], b);
Debug
トレイト
println!()
的なやつに出力するためには、
fmt::Display
を実装するか、deriveアトリビュートを使って簡略化してしまうか(#[derive(Debug)]
)
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}
分割代入っぽいことができる?
moduleの公開
vec
vecのイテレータに対してはdereferenceが必要
vec.rs
for i in v.iter_mut() {
*i *= 2;
}
Error handling
返り値はResult<T, E>
で Option<T>
ではない
Ok(T)
か Err(E)
を返す
error.rs
fn main() -> Result<(), Box<dyn error::Error>> {
}
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> {
}
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);
}
}
Arc
変数を共有したいときに使う
例えば、並列計算を行うとき、1つの変数を複数のスレッドで触るときとか
文字列
いろいろあって難しい(小並)
イテレータ
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
}
Thread
並列処理はArc
や Mutex
を利用する
変数の値を読み書きするときにlockを取得する
C言語と違い、ミューテックスとそれによって保護される変数が1対1に対応している
Arc::new(Mutex::new( some object ));
Macro
実装する順序が重要らしい
moduleとして公開するときは、#[macro_use]
が重要
但し、名前空間は一緒っぽいので名前の衝突に気をつける必要がありそう?
As
異なる型同士で演算を行うことは出来ないので、as
とかで型を合わせてあげる必要がある
From, Into
すごい
advanced_error
?
を動作させるためには From
トレイト( From::from
) を実装する必要がある
parse()
を動作させるためにはFromStr
トレイトを実装する必要がある?(FromStr::from_str()
)
このスクラップは2022/04/01にクローズされました