本サイトを結合したのをおいておきます。 今更ですがRust 1.26が5/10にリリースされました。新機能をおさらいしましょう。今回は相当に大きい変更がたくさん入っています。公式はここです。 impl Trait impl Traitは最大の変更のひとつでしょう。ざっくりいうと、型名のようにimpl Traitを使えます。 use std::fmt::Debug; fn hoge(a: impl Debug) { println!("{:?}", a); } fn fuga() -> impl Debug { 1 } 引数のトレイト境界を指定する使い方の場合、従来のジェネリクスとの棲み分けをどうするべきなのかはすこし気になります。まあ、簡単な場合であればおそらくimpl Traitを使うようになるんでしょう。ただ、微妙にトリッキーなのは、こういう場合がコンパイルエラーになることです。 tr
前回のエントリでは横着してbrew install rustとしたけど、それだといろいろ無いっぽいので、toolchain一式入るように入れ直す。 まずはお掃除 % brew uninstall rust 無いことを確認。 % which rustc % which cargo 公式ドキュメントに従ってインストール www.rust-lang.org % curl https://sh.rustup.rs -sSf | sh 以下、その出力全文 info: downloading installer Welcome to Rust! This will download and install the official compiler for the Rust programming language, and its package manager, Cargo. It will ad
κeenです。やや釣りっぽいタイトルですがRustのデータ並列ライブラリのrayonについて。イテレータを並列に計算できるだけでなくjoinで自分で並列処理を書くこともできるんだよという記事です。 rayonとpar_iter rayonはRustのデータ並列ライブラリです。あの化学繊維のレーヨンです。Thread(糸)にちなんだ名前なんですかね。 rayonで一番良く使われるのはpar_iterでしょう。このように使えます。 use rayon::prelude::*; let vec = vec![1, 2, 3, 4, 5, 6]; // _par_iter でデータ並列計算 let max = vec.par_iter().max(); assert_eq!(max, Some(6)); このようにほぼRustのイテレータを置き換える形で使えます。 その反面、イテレータらしい処理で
最新版 RustとPostgreSQLで色々な型をやりとりしてみた(NUMERIC対応) 目的 RustでPostgreSQLの型をやりとりしてみたという記事ですが、postgresの0.17からだいぶかわったので、修正してみました。 以前の比べて、配列、Option型のサポートが入り、関連するcrateが新しくなりました。 以前の記事もまだ0.14系が現役だと思いますので、残しておきます。 プログラム [package] name = "pg" version = "0.1.0" edition = "2018" [dependencies] bit-vec = "^0.6" chrono = "^0.4" eui48 = "^0.4" geo-types = "^0.4" r2d2_postgres = "^0.16" serde_json = "^1.0" uuid = { vers
概要: Rustのパニック機構は異常終了の処理を安全に行うためにある。この動作を詳しくみていく。 パニックとは何か Rustには2つの異なる例外処理機構があります。 発生源 対処方法 例 パニック プログラミングエラー 原則として捕捉しない assert!() 境界外参照 Result 例外的な入力 必要に応じて捕捉 I/Oエラー (File::read) パースエラー (str::parse) パニックとResultの関係についてはTRPL第2版第9章、未定義動作とパニックの関係についてはRustonomiconのUnwindingの章などが参考になります。 パニックを想定した安全性 Rustではたとえパニック状態でも未定義動作だけは絶対に避ける必要があります。そのため以下の関数は不健全 (unsound)です。 use std::ptr; // この関数はRustではunsound (
概要: Rustの関数ポインタの落とし穴について その1: 関数ポインタはクロージャとは異なる これはC/C++に慣れている人には当たり前ですが、関数ポインタ型 (fn()) とクロージャ型 (Fn()) には重大な違いがあります。それは、関数ポインタは環境をキャプチャーしないということです。大雑把にいうと、 関数ポインタは、ある機械語コードのアドレス クロージャは、関数ポインタと、キャプチャーした環境の対 なので、関数ポインタは、ひとつのプログラムにつき原則として有限個しかないのに対し、クロージャは、キャプチャーする環境によって無限にたくさんのクロージャを作ることができます。例えば、 fn main() { let closures = [3, 7, 1, 5, 8, 9, 2].iter().map(|&i| { move |j| i + j }).collect::<Vec<_>>(
マクロ・クラブのルール マクロを書くな それがパターンをカプセル化する唯一の方法ならば、マクロを書け 例外: 同等の関数に比べて、 呼び出し側が楽になるならば、マクロを書いても構わない κeenです。レーシックを受けようとしたら角膜が薄くて手術拒否されました。予定が狂って時間が空いたのでブログを書きます。 冒頭のルールはプログラミングClojureに出てくるマクロの書き方の指南です。 Rustのマクロって色々できるんだよという記事を書くにあたってマクロに一日の長があるLispの知見を引用されていただきました。 ルールにあるとおり、マクロは関数と違ってRustの第一級オブジェクトでないので扱いづらいですし本体がコピーされるのでコードサイズも膨らんでしまいます。 よく考えながら使いましょう。とはいってもRustの構文はLispに比べると複雑ですし型やパターンマッチなどLispに存在しない構文要
κeenです。進捗ダメです。最近全然コード書いてないのでたまには手を動かすかということでRocksDBにHello Worldしてみます。 RocksDBとは RocksDBはアプリケーション組み込み向けに作られた永続化KVSです。 主に高速性、SSDなどの高速なストレージに合わせたアーキテクチャ、アプリケーションとの親和性、基本操作の他マージなどの高度なオペレーションを特徴としているようです。 FacebookのDBエンジニアリングチームが作っていて、MyRocksなんかのバックエンドに使われています。 GoogleのLevelDBを下敷きに作られている模様。 私が知ったきっかけはやはりMySQL互換プロトコルを喋る分散DBのTiDBがバックエンドに使っているからでした。 Hello, RocksDB いくら新しいとはいえ、ただのKVSなので使い方はそんなの難しくないはず。とりあえず使っ
κeenです。「XX言語はデフォルトイミュータブルだ」とか「この機能を使うとイミュータブルになる」とかのもの、よく混乱が見受けられますよね。 ユーザの勘違いもありますし言語毎に指しているものが違ったりするので整理してみます シャドーイング イミュータブルなはずなのに変数が上書きできてしまう、あれ?というやつです。 以下のようなClojureのコードを考えます。 馴れてないと(どちらかというと束縛と代入を一緒くたにする言語に毒されてると)「xに2回代入しようとしてるからエラーになるか2回目は無視されて1のままのはず」と考えてしまいます。 しかし実際の実行結果はエラーにはならず、 1 2 と更新されています。 これは先述のとおり束縛と(再)代入を混同していると起きる勘違いです。 (def x 2)はもともとあったxという変数を上書きしているわけではなく、xとは別の新しい変数xを作っているだけで
rust のベンチマーク取る時は `cargo build --release` しなくてはならない [package] name = "hello_world" version = "0.1.0" authors = ["Your Name <[email protected]>"] [dependencies] futures = "0.1.14" hyper = "0.11" で extern crate hyper; extern crate futures; use futures::future::Future; use hyper::header::ContentLength; use hyper::server::{Http, Request, Response, Service}; struct HelloWorld; const PHRASE: &'static str
κeenです。New Year’s Rust: A Call for Community Blogpostsの一環のつもりです。 恐らく英語の記事が望まれてるんだろうなと思いつつも試しに日本から声を上げてみます。 私はRustは1.0前後の頃から触っていて、ドキュメントの翻訳をしたりここ1年くらいはIdein Inc.での業務でも使っています。 1年ほど使ってみて何が足りないか考えてみます。 言語 Associated HKT 本当は一般のHKTがあると便利ですがひとまずはAssociatedなものが欲しいです。RFCでいうとこれです Generic associated types (associated type constructors) 。 欲しい状況は1つにはRFCと似たようなものなので割愛します。 GeneralなHigher Kinded Typesが欲しいのはtransac
概要 この記事は言語実装Advent Calendar 2017 25日目用として書かれたものです。 Advent Calendar初参加です。迷っていたら25日が空いていたので、思い切って飛び込んでみました。 でもよく見たら、なんだかテーマは高度なことばかり。 私はそのようなことは全然書けるような実力はありませんので、できることだけをやりました。こわい。すいません。 ソースコード Epiqsという名前です。たらい関数とfibonacciは動いてますよー。 READMEは古い記述がたくさん残ってるので直したいよー。 github.com 動機 たくさんある。なんだか思いの丈がまとまっていないが、そのまま書く。 ちなみに私は「ポエム」という表現を使うのは好まない。 書いていて気づいたが、言語実装というよりは言語「設計」という趣である。 コンスセル大好き Lisp系言語が好きなのだが、最近、ど
κeenです。方々で言われる話ですがRustコンパイラの吐くバイナリはそこそこ大きいです。 この理由を自分で納得してなかったので追います。 様々な理由からnightlyを使います。 初期 $ cat hello.rs fn main() { println!("Hello, World"); } $ rustc +nightly hello.rs $ ls -l hello -rwxr-xr-x 1 kim kim 5049344 12月 18 23:30 allocator 5MBくらいあります。等価なCのコード(gccでオプションなし)が8.2Kだったのでかなり大きいですね 最適化 cargo --releaseと同じく-Copt-level=3を付けましょう。-Copt-level=sの方が小さくなりますが普段やらないので。 $ rustc +nightly -Copt-level=
κeenです。これはRust Advent Calendar 2017の記事です。 RustのORM、クエリビルダ、マイグレーションツールのdieselについて。 dieselについては公式チュートリアルを読めばだいたい使い始められるのですが、それだけでは足りないのでいくつか持ちネタを書きます。 diesel-1.0.0-beta1での情報です。 table! マクロ チュートリアルにはinfer_schema!を使ったDSLの自動生成が書かれてますが、table!マクロを使って自分で書くこともできます。 table! { posts { id -> Integer, Title -> Text, body -> Text, published -> Bool } } このときの型はdieselで定義されているSQL型を書きます。 このSQL型は特定のDBMにあるものも用意されていて、例え
Two weeks ago, Alex Crichton’s PR adding a target for WebAssembly to the Rust compiler was merged. There are many differences between this target and the Emscripten one, but the important one for me is that it doesn’t depend on external stuff like the Emscripten SDK (which IIRC used to be a pain to get working on Windows, but seems to be better now). After seeing the examples on hellorust.com, I t
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く