rust

::<T> turbofishの役割

ジェネリクスのパラメーターを指定する 例1 std::any::type_name<T>() -> &'static str fn type_of_val<T>(_val: T) ->&'static str { std::any::type_name::<T>() } 例2 std::iter::Iterator::collect<B>(self) -> B let tokens = "xyz 1 1.0 *".split_whitespace().col</b></t></t></t>…

Stdin::lock(&self)の役割

Stdinの問題 標準入力ストリーム処理を行うためのハンドル。 各ハンドルはグローバルバッファを共有参照する。 そのため1バイト読み込むごとに排他制御が作用し、遅くなる。 Note: ハンドル (handle) ストリームとは流れを意味する。 stdinは、この流れを制…

覚えておきたい基本トレイト

モノから文字列への変換 - ToString プリント出力 - Display / Debug 初期値 - Default 変換 - From<T> / Into<T> コピーの生成 - Clone / Copy 失敗のある変換 - FromStr ToString は失敗しない変換 参照変換 - AsRef<T: ?Sized> オーナーシップ - Borrow String - owe their</t:></t></t>…

Copy / Clone トレイト

Copy と Clone の違い Copy 複製は暗黙的に行われる。マーカートレイトの一つで、ビット列のコピーが行われる。Sallow copyとなるため、参照をうまく扱えない。 Clone 複製は明示的に行う必要がある。cloneメソッドを実装することで、コピー内容を変更できる…

Stringの生成

文字列 (String)の生成から、各トレイトの理解が重要であることがわかる。 let s = "hello".to_string(); // ToString let s = String::from("hello"); // From let s: String = "hello".into(); // Into let s = "hello".to_owned(); // ToOwned 参照 The C…

std::io::prelude::* の役割

preludeの役割 IOモジュールが再エクスポートされる。 これによって一つ一つインポートする苦痛を緩衝させる目的があるとのこと。 pub use super::BufRead; pub use super::Read; pub use super::Seek; pub use super::Write; 参照 doc.rust-lang.org

モジュールシステム

モジュール Rustは1ファイル1モジュールである。 使用するモジュールはルートファイルで宣言する必要がある。 ファイルモジュール ファイル構成 src -+ - main.rs | + module_a.rs | + module_b.rs src/main.rs mod module_a; mod module_b; ディレクトリ…

トレイト境界 structとimpl どちらにつけるべきか

ジェネリクス in Rust ジェネリック型パラメーターを持つ関数や型をジェネリック(generic)と呼ぶ。 参照: ジェネリクス Generics - あるマのメモ書き Rustでは、型の宣言側(struct, enum, trait)と実装側(impl)、両方においてジェネリック型パラメーターを宣…

Dynamically Sized Type (DST)

動的Sized型 (DST) 変数、関数パラメーター、static項目、const項目はSizedトレイトでなければならない。 これはRustは、コンパイル時にすべての型のサイズが決定している必要があることを意味する。 (※ Structは暗黙的にSizedトレイトが実装される。) しか…

1モジュール、1ファイル構成

ソースコード構成 1 src -+- main.rs | +- foo.rs | +- bar.rs main.rs mod foo mod bar fn main() { ... }

日本の現在時刻の取得

let current_tokyo_time = FixedOffset::east(60 * 60 * 9).from_utc_datetime(Utc::now().naive_utc().as_ref()); println("{}", current_tokyo_time Note Date / DateTime の生成 以下のTimeZone トレイトを実装しているstructから生成できる Utc - 協定時…

html inputタグから取得したFileをRust側で読み込む

github.com lib.rs #[wasm_bindgen] pub async fn load_file(file: web_sys::File) { let cb = Closure::wrap(Box::new(move |text| { web_sys::console::log_1(&text); }) as Box<dyn FnMut(JsValue)>); let promise = file.text().then(&cb); let result = wasm_bindgen_future</dyn>…

Iterator `map` and `filter`

map 要素は参照として渡される filte 要素はダブル参照として渡される map 例: Vec<bool> // map<B, F>(self, f: F) -> Map<Self, F> where F: FnMut(Self::Item) -> B, // Self::Item = &T let nums = [1, 2, 3, 4, 5]; let is_evens = nums.iter().map(|&n| { if n % 2 == 0 { t</self,></b,></bool>…

スマートポインタ

スマートポインタとは Rustにおけるスマートポインタとは内部に値を持ち、C言語のポインタのような振る舞いをもつデータ構造であり、唯一ヒープ上で値が確保される。 その他のRustの値は全てスタック上で確保される。 以下の2つのトレイトが実装されている…

WebAssembly 準備

用意するもの The Rust Toolchain rustup rustc cargo wasm-pack ビルド、テスト、WebAssemblyの生成のためのワンストップショップ https://rustwasm.github.io/wasm-pack/installer/ curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | s…

ToOwnedトレイト

メモ スライスから元のスマートポインタに変換することができることで使われているように思う。 Borrow<Borrowed>トレイトを実装することで自動導出もされる。 動機 Stringはメソッドを呼ぶと返り値として&strを返すものがあります。 例 trim_end // 改行を取り除くと </borrowed>…

基数ソート in Rust

基数ソート radix sort O(N logN) バケットソートは巨大な数字が存在するとその分箱の数を用意する必要がある 基数ソートは各桁に対してバケットソートすることで最後にソートすることができる // Number of Digits const D: usize = 3_usize; // Number of …

バケットソート in Rust

バケットソート bucket sort O(N logN) 比較をしないソート 含まれている値の種類の数が決定している必要がある ( = バケツの数) const RANGE: usize = 10; fn main() { let a = [5,4,6,7,1,3,8,2,9,0]; let mut d = [0;RANGE]; bucketsort(a, &mut d); prin…

バブルソート in Rust

バブルソート bubble sort O(N^2) 先頭から順に隣同士比較していく (最大値から決定する) fn main() { let mut a = [8, 3,4, 3, 7, 6, 5, 2, 1, 10]; for i in 0..a.len() { for j in i+1..a.len() { if a[j] < a[i] { a.swap(i, j); } } } println!("{:?}",…

選択ソート in Rust

選択ソート selection sort O(N^2) 最小値から順に決めていく 安定ソートでない fn main() { let mut a = [3, 2, 1, 4, 1]; for i in 0..a.len() { let mut min = i; for j in i..a.len() { if a[min] > a[j] { min = j; } } a.swap(i, min); } println!("{:…

挿入ソート in Rust

挿入ソート insertion sort O(N^2) 第2項から先頭に向かって隣同士入れ替えていく 昇順 fn main() { let mut a = [10, 3, 3, 1, 90, 34, 78, 2, 12, 56, 1]; for ins in 1..a.len() { // 挿入する値を退避 let temp = a[ins]; for cmp in (0..ins).rev() { …

関連型を持つトレイトオブジェクトを宣言する

dyn トレイト<関連型 = 型> trait Tr { type Ty; fn go(&self) -> () {} } struct St {} impl Tr for St { type Ty = String; fn go(&self) -> () {} } // トレイトオブジェクトに対して関連型を指定できる fn foo(t: &dyn Tr<Ty = String>) -> () { t.go() } fn main() {</ty>…

mutable参照は所有権を移動する

サンプルコード let mut s1 = String::from("hello"); // s2はmutable 参照 let s2 = &mut s1; print_type_name_of(s2); s2.push_str(" world"); /* error[E0382]: borrow of moved value: `s2` | 3 | let s2 = &mut s1; | -- move occurs because `s2` has …

Fibonacci in Rust

#[derive(Default)] struct Fibonacci { pair: (u64, u64), cnt: u64, max: u64, } impl Fibonacci { fn new(max: u64) -> Fibonacci { Fibonacci { pair: (0, 1), max: max, ..Default::default() } } fn reset(&mut self) { self.pair = (0, 1); self.cnt …

asキーワード

プリミティブ型の変換で使用する。 f64からi32に変換する事ができる。 let p: f64 = 50.5; let a: i32 = 50.5 as i32; Note: 標準では、f64からi32のFromトレイトは用意されていない // NG let a: i32 = i32::from(p)

エラーハンドリング Result<T, E>

Rustのエラーハンドリングは以下の2種類にグループ分けされる 回復不可能なエラー panic! 回復可能なエラー Result<T, E> Result<T, E> Rustには例外処理が存在しないため、その代わりにResult<T, E>を使う。 pub enum Result<T, E> { Ok(T), Err(E), } 各variant Ok(T) 成功時 Err(</t,></t,></t,></t,>…

基本トレイト

概要 Rustの型(struct, enum)は継承が不可。 メソッドは実質関数に過ぎない。 ある特定の振る舞いの抽象化はトレイトを通して実現する。 (この点からRustの型はHaskellのdata型、トレイトは型クラスに対応すると考えることが出来る。) 標準スタンダードライ…

所有権 備忘録

所有権 移譲 (Move) 借用 (Borrow) 移譲 let a = String::from("Hello World"); let b = a; // 値の所有権が移ると変数aは二度と使えない 借用 参照にすることで、値の借用となる。 let a = String::from("Hello World"); let b = &a; // immutable borrowが…

Rustの標準ライブラリが難しい

標準入力から文字列を読み取るサンプル例 use std::io; fn main() -> io::Result<()> { let mut buffer = String::new(); let stdin = io::stdin(); let mut handle = stdin.lock(); handle.read_to_string(&mut buffer)?; Ok(()) } 上記はコンパイルエラー…