プロパティ

Properties プロパティの宣言 varキーワードは、変更可能。valキーワードは、読み取り専用となる。 class Address { var name: String = "Holmes, Sherlock" var street: String = "Baker" var city: String = "London" var state: String? = null var zip: …

クラス継承

kotlinlang.org 継承 すべてのKotlinのクラスは、Anyを継承している。 class Example // 暗黙的に Any を継承している Anyは3つのメソッドを持っている。 equals() hashCode() toString() クラスは、デフォルトは、finalであり、継承することができない。 /…

クラス まとめ

kotlinlang.org Classes classキーワードを使ってクラスを宣言する。 class Invoice { /*....*/ } class header: 型パラメーター, プライマリーコンストラクタ,など class body headerもbodyもオプションなので、省略が可能。 class Empty Constructors 以下…

匿名関数

匿名関数 本体の指定は2種類ある 式の代入 ブロックの指定 式の代入 fun(a: Int, b:Int):Int = a + b この場合は、代入を使うことができない // Assignments are not expressions, and only expressions are allowed in this context ints.forEach(fun(v) =…

関数リテラルまとめ

kotlinlang.org 関数リテラル Kotlinは関数リテラルとして以下が用意されている ラムダ式 匿名関数 特徴 関数リテラルは、式として渡されるが、値として振る舞う事ができる 。 以下の例を考える max(strings, { a, b -> a.length < b.length }) 関数maxは、…

<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>…