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

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