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

関数ポインタとクロージャー

関数ポインタ fn do_twice(f: fn(i32) -> i32, arg: i32) -> { f(arg) + f(arg) } // add_one: fn(i32) -> i32 do_twice(add_one, 1); fn: 関数ポインタを表す 関数の引数にわたすことが出来る 3つのクロージャートレイト(Fn, FnMut, FnOnece)を実装している…

Cargo 開発コマンドチートシート

プロジェクトの生成 cargo new プロジェクト名 ./cargo/binディレクトリへのインストール cargo install -path . --path .: カレントディレクトリ配下のCargoプロジェクトをインストールする tomlの編集 cargo-editをインストールする必要がある。 外部クレ…

Result型 のアンラップとエラーの伝搬

Result<T, E>型の特徴 Rustは例外処理が存在しない代わりに、Result型でそれを実現する。 値のアンラップ エラーの伝搬 値のアンラップ unwrap: Err時、panic!を引き起こす unwrap_or: Err時、デフォルト値を返す unwrap_or_else: Err時、デフォルト値を生成する関</t,>…

Result map処理

Resultに用意されているmap処理 map: Okの型を変換する map_err: Errの型を変換する map_or: 値をアンラップする。デフォルト値を渡せる map_or_else: 値をアンラップする。デフォルト値の評価を遅延評価する map(成功時のmap処理) Result<T, E> から Result<U, E>に変換</u,></t,>…

標準入力から文字列を受け取る

<C-c>が入力されるまで受け付ける fn main() { // 標準入力へのハンドルを生成 (各ハンドルはバッファーを共有される) let stdin = std::io::stdin(); // lockすることでバッファーを専有する let stdin = stdin.lock(); // <C-c>が入力されるまで受け付ける for line </c-c></c-c>…

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

コンビニのレジ袋代について

ファミマのCMで中華まんが100円と連呼されていたので、「中華まん」を2つお願いしますと。 ただ外国人の店員さんには通じなかったのか、「肉まん?」と聞き直されます。 再度「中華まん」と伝えるも通じず、「ピザまん?」と聞き直されます。 なので直接…

モジュールシステム

モジュール 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)、両方においてジェネリック型パラメーターを宣…

`text-align`を用いた中央寄せ

CSS

中央寄せ with text-align gist html <div class="container"> <div class="content"> <h2> 果物リスト</h2> <ul> <li>りんご</li> <li>ばなな</li> <li>みかん</li> <li>ぶどう</li> </ul> </div> </div> css .container { display: block; text-align: center; } .content { display: inline-block; } NOTE: text-align: inlineに対してのみ有効

Dynamically Sized Type (DST)

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

child_processから起動させる

方法1 #!/usr/bin/env node const { spawn } = require('child_process') const subprocess = spawn('./node_modules/electron/cli.js', ['./index.js'], { 'stdio': ['inherit', 'inherit', 'inherit'] }) 方法2 PATHを通してコマンドを叩く const { spawn …

templatesとslots

概要 webコンポーネントのshadow DOMとしてポピュラーに使用されている templatesについて より簡単にマークアップを使い回す事ができる。 template要素とその中身はDOM内にはレンダーされないが、 JavaScriptを通して参照することが可能。 簡単なtemplate例 <template id="my-paragraph"></template>…

単位 em と rem

CSS

よく忘れるのでメモ。 どちらもfont-sizeを表す。 単位 説明 1 em 要素のfont-size 1 rem root要素のfont-size 要素の font-size が 10pxのとき 単位 サイズ[px] 1 em 10px 2 em 20px 3 em 30px 参照 ルート要素 (= html要素) developer.mozilla.org

command の 標準入出力 覚書

child_process.spawn(command [, args] [, options]) command を 新規のプロセスで実行し、subprocess を生成する。 (command は 子プロセスとなる) options.stdio command の標準入出力先を設定する。 pipe: デフォルト。commandの標準入出力は、subproces…

child_processを使ってVimを起動する

コード const { spawn } = require('child_process'); const subprocess = spawn( 'sh', [ '-c', 'vim' ], { stdio: ['inherit', 'inherit', 'inherit'] } ); // 2秒後に終了させる setTimeout(() => { subprocess.kill(); // Does not terminate the Node.j…

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

import 構文

2種類ある default import named import default import export default 文によってexportされた値は、import時に任意の名前を付けることができる lib.js export default 42 app.js import A from './lib.js' import Num from './lib.js' named import expor…

スマートポインタ

スマートポインタとは 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 …