2021-02-01から1ヶ月間の記事一覧

強参照Rc<T> と弱参照Weak<T>

std::rc::Rc<T> 概要 動的な参照を実現。&演算子による参照がコンパイル時にされるのに対して、Rc<T>は実行時に参照を確保する。 これによってライフタイムを除去することができる。 ライフタイムの除去 参照による共有 借用チェッカーを通すために、ライフタイム</t></t>…

std::rc::Rc<T> と std::cell::RefCell<T>

Rc::borrow_mut の問題 let file = File::open("text.txt")?; let mut bufreader = BufReader::new(&file); let shared_reader = Rc::new(bufreader); // NG let _ = *shared_reader.borrow_mut().read_line(&mut line)?; /* error[E0599]: no method named …

循環参照 - Rc<T>とRefCell<T>

循環参照はメモリーをリークする Rustのメモリ安全保障において、メモリーリークを発生させることはとてつもなく難しい。 Preventing memory leaks entirely is not one of Rust's guarantees in the same way that disallowing data race at compile time i…

スマートポインタ Rc<T> - 参照カウンタ

Rc<T>, the Reference Counted Smart Pointer 所有権は多くの場合において明白である。つまり「1変数は、1つの値の所有する 」。 しかしながら 一つの値が複数の所有者を持つ ケースが存在する。 例として、グラフ構造がある。 グラフは、複数の辺が同一のノ</t>…

ジェネリクスとトレイトオブジェクトの破壊的変更への対処

動機 ジェネリクスとトレイトオブジェクトの抱える問題 壮大たる破壊的変更につながる。 例 Fileインスタンスを持つStreamをジェネリクスに変更する struct Stream { reader: std::fs::File, } impl Stream { fn new(reader: std::fs::File) { Stream { read…

関数パラメーターにおける参照外し

関数パラメーターにおいても参照外しを行うことができる 例1 クロージャー map関数 let result = [1,2,3,4,5].iter().map(|&&x| x % 2 == 0).collect(); &&x : 参照参照外しをおこなっている 例2 関数の定義 参照外ししない場合 fn print_type_name<T>(_val: T)</t>…

Cargoプロジェクト Examplesの追加

Cargoで作ったライブラリプロジェクトにExamplesを追加することができる。 xion.io // examples/hello.rs fn main() { println!("Hello from an example!"); } $ cargo run --example hello $ cargo run --example hello2 -- Alice

トレイトオブジェクトの保持とライフタイム

トレイトオブジェクトとライフタイム トレイトオブジェクトを保持する場合は、ライフタイムが必要となる時がある。 ジェネリクス型パラメーター 参照型 トレイトオブジェクト x ジェンリクス型パラメーター struct Zoo { animals: Vec<Box<dyn Animal>>, // trait Animal { .</box<dyn>…

トレイト - 共通の振る舞いを定義する

https://doc.rust-lang.org/book/ch10-02-traits.html トレイト: 共通の振る舞いの定義 概要 トレイトを使って共通の振る舞いを定義 トレイトのデフォルト実装 トレイトをパラメーターに指定できる impl Trait トレイト境界 impl Traitのシンタックスシュガ…

トレイトの選択 完全限定構文 (Fully Qualified Syntax)

Fully Qualified Syntax Fully Qualified Syntax for Disambiguation: Calling Methods with the Same Name https://doc.rust-lang.org/book/ch19-03-advanced-traits.html fully qualified syntax (完全限定構文?) <Type as Trait>::function(receiver_if_method, next_arg</type>…

Iterator / IntoIterator / FromIterator

trait Iterator pub trait Iterator { type Item; fn next(&mut self) -> Option<Self::Item>; 実装している主要な型 std::slice::Iter<'a, T> Iterator派生型 Map Filter String.bytes Note: Vec<T>や配列[T]はIteratorではない。 これらがfor文で使えるのは、暗黙的にInto</t></self::item>…

クロージャー

概要 Rustのラムダ式はクロージャーと呼ぶ 関数ポインタ(fn)は、外部環境変数を含めることができない 関数ポインタもクロージャートレイトを実装している クロージャーの種類 (キャプチャー方法が異なる) FnOnce<Args>: selfメソッド, キャプチャー変数を消費する</args>…

スマートポインタの役割

Rustは関数ローカルの変数を参照として返すことができない impl Reader { fn new(path: impl AsRef<std::path::Path>) -> Reader { let file = std::fs::File::open(path).unwrap(); Reader { file: file, } } fn read_bytes(&mut self, len: usize) -> &[u8] { let mut bytes</std::path::path>…