2021-01-01から1年間の記事一覧

<c-\><c-n> ターミナルでスクロールする

Vim

対策 tnoremap <c-b> <c-\><c-n> stackoverflow.com</c-n></c-\></c-b>

レシーバー付き関数リテラル

https://kotlinlang.org/docs/lambdas.html#function-literals-with-receiver 関数リテラル with receiver (レシーバー付き関数リテラル) レシーバー付き関数型: A.(B) -> C 型A(レシーバー)に対して、(B) -> C 型の関数リテラルを埋め込むことができる。 レ…

ラムダ式とクラスによる関数型の実装

ラムダ式の正体は関数型を実装したクラスである。 ラムダ式 val f: (Int) -> (Int) -> Unit = { i: Int -> { j: Int -> println(i + j) } } f(1)(5) // 6 f.invoke(1).invoke(5) // 6 invoke()メソッドを通じて関数をコールすることができる クラスによる関…

末尾再帰関数 tailrec

https://kotlinlang.org/docs/functions.html#tail-recursive-functions 末尾再帰関数の場合は、tailrec キーワードを付けることで、コンパイラが最適化し、高速化する。 val eps = 1E-10 // "good enough", could be 10^-15 tailrec fun findFixPoint(x: Do…

gradle run でコンソールから入力を受け付けるようにする

Console application with Java and gradle - Stack Overflow build.gradle.kts (Kotlin syntax) tasks.getByName<JavaExec>("run") { standardInput = System.`in` } もしくは、 build.gradle (Groovy syntax) run { standardInput = System.in }</javaexec>

Compositeパターン

www.techscore.com 再帰的な構造の取り扱いを容易にするもの

アンチパターン Deref ポリモフィズム

github.com use std::ops::Deref; struct Foo; impl Foo { fn m(&self) { println!("hello, I'm Foo"); } } struct Bar { f: Foo, } impl Deref for Bar { type Target = Foo; fn deref(&self) -> &Foo { &self.f } } fn main() { let bar = Bar { f: Foo, }…

JavaScriptからhtmlファイルのロード

stackoverflow.com <script> fetch('page.html') .then(data => data.text()) .then(html => document.getElementById('elementID').innerHTML = html); </script> <div id='elementID'> </div>

:bo[tright] vsp | sp

vim

メソッドの返り値として参照を渡すとその変数の借用が発生する

use std::collections::HashMap; #[derive(Debug)] struct A { fields: Option<HashMap<i32, String>>, } impl A { fn get(&self, key: i32) -> Option<&String> { if let Some(ref fields) = self.fields { if let Some(value) = fields.get(&key) { //return Some(value.clone()</hashmap<i32,>…

演算子

Operators Rustのオペレーターは、std::opsで定義されている。 演算子のオーバーロードは、対応するtraitを実装する。 Add + infix operator 定義 pub trait Add<Rhs = Self> { type Output; pub fn add(self, rhs: Rhs) -> Self::Output; } Rhs: RustはtraitもGenericパ</rhs>…

マクロルール(macro_rule!)を使って型の定義

image-rsから macro_rules! define_colors { {$( $ident:ident, $channels: expr, $alphas: expr, $interpretation: expr, $color_type_u8: expr, $color_type_u16: expr, #[$doc:meta]; )*} => { $( // START Structure definitions #[$doc] #[derive(Parti…

トレイト境界 サイズ未決定型を受け取れるようにする

トレイト境界はデフォルトでSized付けされる。 (Sized付けされるので、コンパイル時にサイズが決まっている必要がある) NG trait A { fn receive_from_b<T: B>(&self, b: &T); } trait B { fn send_a<T: A>(&self, a: T) { a.receive_from_b(self); } } /* error[E0277</t:></t:>…

トレイトオブジェクトになれないトレイト

Using Trait Objects That Allow for Values of Different Types - The Rust Programming Language 以下のメソッドを含むトレイトは、トレイトオブジェクトになれない (オブジェクトセーフではないため) Selfを返す ジェネリクス型 Note: Swiftでも型として…

有限オートマトン (Finite State Machine)

元ネタ 有限オートマトン - Wikipedia 手続きを表す機械を表すことができる 2種類存在する アクセプタ/リコグナイザ トランスデューサ アクセプタ/リコグナイザ (Accepta / Recognize) 受容もしくは理解 niceを受容する有限オートマトン 初期状態: どこから…

Type-directed Programming

元ネタ COS 326: Functional Programming Type-directed Programming methodology とは 関数とその引数と返り値の型を書く その関数の目的とコンディションについてコメントを書く その関数を使うための参考例を書く 関数本体を書く (この部分が一番重要!) …

カスタムの型をHashMapのキーにする時のための Borrow<Borrowed> トレイト

Vec<u8> をフィールドに持つ型Nameがあるとする。 struct Name<Vec<u8>> このNameをHashMapのキーとする場合、毎回Vecから生成する必要がこのままでは発生する。 fn get(&self, key: &[u8]) -> &String { let name = Name(key.to_vec()); self.0.get(&name).unwrap() } </vec<u8></u8>…

参照として値を取りだす if let式

if-let式 if-let式はunwrapなので、 Tがコピーセマンティクスならば、コピーされるが、そうでない場合は、所有権が移動する。 所有権を移したくない場合は、refキーワードを付けて、参照にする。(値を借用する) // buf1 : case Cmd(Vec<u8>) if let Cmd(ref cmd)</u8>…

可変参照のライフタイムにおける所有権の移動と再借用

元ネタ yohhoy.hatenadiary.jp いずれのケースでもm2の型は&mut i32に相当するが、厳密には参照のライフタイム(lifetime)が異なる別の型である 可変参照の変数束縛 ライフタイムが同一かどうかで、所有権が移動するかどうかが決まる。 同一: 移動する 異なる…

ライフタイムとライフタイム付き可変参照

struct MutableDataWithLifeTime<'a> { // ライフタイム付き可変参照 val: &'a mut i32, } struct ShortLifeTime; impl ShortLifeTime { fn take_data<'a>(data: &'a mut MutableDataWithLifeTime<'a>) { *data.val *= 2; } } struct LongLifeTime; impl Lon…

自己参照構造体は作ることが出来ない

Qiitaからのメモ 【Rust】構造体に自身のフィールドの参照の配列を持たせる方法 - Qiita struct Bullet<'a>(&'a Texture); struct Enemy<'a> { bullet_texture: Texture, bullets: Vec<Bullet<'a>> } impl<'a> Enemy<'a> { fn new(bullet_texture: Texture) -> Self { E</bullet<'a>…

強参照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のシンタックスシュガ…