ラベル Rust の投稿を表示しています。 すべての投稿を表示
ラベル Rust の投稿を表示しています。 すべての投稿を表示

2025/08/13

Rustで学ぶ型コンストラクタ

型コンストラクタとは

型コンストラクタとは、ざっくり言うと「新しい型を作るための型」です。

普段使っているi32Stringなどは、それ自体が完成された一つの型です。

一方、型コンストラクタは、型を引数として受け取り、新しい型を生成するものです。


2025/08/07

RustのトレイトとOCamlのシグネチャの比較

Rustのトレイト

Rustのトレイトは、型が持つべき振る舞い(メソッド)を定義する機能です。これは、他の言語におけるインターフェースや型クラスに非常に似ています。


2025/08/06

Rustの関連型について

関連型とは?

Rustの関連型は、トレイトに特定の型を紐づけるための仕組みで、簡単に言うと「このトレイトを実装する型は、必ずこの名前で特定の型を持つ必要がある」というルールを定義するものです。


2021/01/26

リストを2つのグループに分ける関数を作る

partition

OCamlのListモジュールにはpartitionという便利な関数がありまして、これを使うとクイックソートが簡単に書くことができます。


let rec qsort = function
  | [] -> []
  | h :: t ->
    let (l, r) = List.partition (fun x -> x < h) t in
    (qsort l)@[h]@(qsort r)

こりゃ便利!と思い、他の言語でも使いたい!ということで自前で書くことにしました。


2021/01/15

新年のご挨拶とマージソート

ご挨拶

もう新年を迎えて2週間も経ってしまいましたが、新年あけまして、おめでたくないですが、皆様にとって良い一年になりますように。

当ブログは去年の末におかげさまで閲覧数が10000を超えました。一般的なブログの閲覧数とは雲泥の差ではありますが、なんとなく嬉しいです。今後もバタバタしながらも、時間を見つけて記事を書いていこうと思います。

新年早々に感染爆発・緊急事態宣言とえげつない状況となってしまいましたが、我々ができることは手洗い、うがい、目洗い、マスク、自粛のみ。それ以外はどうしようもできないことなので、自分でできることは全てやって、だめならだめでしょうがない、という気持ちで生きていきましょう。

今年もどうぞよろしくお願いいたします。


2020/09/08

Rustのif letが便利

if let

Rustではmatch式の省略形とも言えるif letというものがあります。

実は私、最近までこれを使わずmatch式をメインに使っていました。例えば以前の記事でRustのsubsliceを使ってL99問題をやってみるというものを書きましたが、そのコードのすべてがmatch式によるものでした。

しかし、今回if letを使って書き直してみると、何ともすっきりとしたコードになり、すっかりif letが気に入ってしまいましした。


2020/06/30

RustでOCamlのL99(Logic and Codes)をやってみる

Rustのenumが活躍しそう

ここ最近ずっとOCamlのL99をCommon Lispで書いてみるということをやっているのですが、あまり同じ言語ばかりやっていては、私の頭の中から他言語の知識が消えてしまう恐れがありますので、定期的に使う必要があります。悲しい脳みそです。

Common Lispのほうは現在L-37あたりまで進みましたが、今回は気分転換に、その先のL-46あたりのLogic and CodesというパートをRustでやってみようと思います。

まずドキュメントには以下のコードが書かれています。


# type bool_expr =
    | Var of string
    | Not of bool_expr
    | And of bool_expr * bool_expr
    | Or of bool_expr * bool_expr;;

2020/04/01

RustのsubsliceでちょこっとL99問題を試してみる 〜その2〜

前回の続き

前回はL-04までやりましたので、今回はL-05から試してみようと思います。
第5問目。「リストを逆順にする関数」の作成。OCamlのコードは以下。

let rev list =
  let rec aux acc = function
    | [] -> acc
    | hd :: tl -> aux (hd::acc) tl in
  aux [] list
;;
与えられたリストの先頭をaccの先頭に追加していくという形。

2020/03/28

RustのsubsliceでちょこっとL99問題を試してみる

OCamlと比較してみる

L99問題は以前Common Lispの記事で少し取り上げました。今回はOCamlのL99を元にRustで少しやってみようかと思います。
まず第一問目は、「リストの最後の要素を返す関数と作成する」という問題です。OCamlでは以下のようになります。

2020/03/15

Rust 1.42.0 で実装されたsubslice

subslice

今回のアップデートでsubsliceなるものが実装されました。個人的には「おっ、便利!!」なんて思ったのですが、皆様はいかがでしょうか?
以前までは以下のコードはコンパイルできませんでしたが、今回のアップデートでは可能となりました。

2020/02/19

Rust+SDL2でカラーチェック

色を見ながら調整する

RustとSDL2で色を見ながら調整し、最終的にその色のRGBの値とカラーコードを表示するというシンプルなアプリケーションを作成してみました。ソースコードはGitHubに置いていますが、以下のようになっています。

use sdl2;
use sdl2::video::Window;
use sdl2::render::Canvas;
use sdl2::event::Event;
use sdl2::pixels::Color;
use sdl2::keyboard::Keycode;
use std::error::Error;

2020/02/06

RustでSDL2 その4

step7 マウス操作

いよいよ、とりあえず最後のステップ7です。今回はマウスで操作するものを作ります。といってもキーボード操作の時と大きく違うことはありません。共通しているのは座標をどう扱うかというだけです。コードは以下のようになりました。

use sdl2;
use sdl2::event::Event;
use sdl2::keyboard::Keycode;
use sdl2::mouse::MouseState;
use sdl2::image::{LoadSurface, InitFlag};
use sdl2::rect::Rect;
use sdl2::surface::Surface;
use std::time::Duration;
use std::thread;
use std::path::Path;

2020/02/04

RustでSDL2 その3

step5 壁に反射するアニメーション

前回のアニメーションは下から上へ動いていくだけのものでしたが、今回はウィンドウの枠に当たると反射するアニメーションの作成です。まずはソースコードを。

use sdl2;
use sdl2::event::Event;
use sdl2::keyboard::Keycode;
use sdl2::image::{LoadSurface, InitFlag};
use sdl2::rect::Rect;
use sdl2::surface::Surface;
use std::time::Duration;
use std::thread;
use std::path::Path;

2020/02/02

RustでSDL2 その2

step3 画像の表示

前回はウィンドウの表示までできましたが、今回は画像を表示してみようと思います。C、NimではSDLの初期化、ウィンドウ作成、レンダラー作成、画像を読み込んでサーフェスへ、サーフェスからテクスチャ作成、サーフェス解放、レンダラーで表示、諸々クリーンアップといった流れになっていましたので、同じようにやってみます。

use sdl2;
use sdl2::event::Event;
use sdl2::keyboard::Keycode;
use sdl2::image::{LoadSurface, InitFlag};
use sdl2::rect::Rect;
use sdl2::surface::Surface;
use std::time::Duration;
use std::thread;
use std::path::Path;

2020/01/30

RustでSDL2 その1

step1 初期化とクリーンアップ

C、Nimに続き、RustでもSDL2を試してみました。
Rustではsdl2クレートを使わせてもらいました。使った実感としましては、ところどころ違いがあり、ソースコードを結構読みましたが、大体同じ知識で使えるという感じでした。C、Nimと同様step1~7まで作ったものはGitHubに置いておきましたが、一応解説ということで記事にしました。

2020/01/06

Rustで始まる2020年

年末年始にtraitの理解が進んだ私

新年あけましておめでとうございます。
年末年始、皆様いかがお過ごしだったでしょうか?忘年会や新年会など半ば強制的なイベントで体調を崩したり、体が重くなったりしてませんでしょうか?
私は平常通りに過ごしました。いや平常よりも本をよく読みました。何せ理解の遅い私ですから、皆様と同じように過ごしていては年齢的にも永遠に追いつけません。年末年始は私にとって、絶好のチャンスです。やらねばなるまい……

2019/12/26

Rustのpubキーワードの公開範囲を知る

pubキーワード

C++やjavaなどではpublicprivateprotectedなどのキーワードを付けることで、公開範囲を決定することができますが、Rustではシンプルにpubキーワードのみとなっています。その代わり、pub(..)といったかたちで範囲を変更することができます。

2019/10/16

色、いろいろ(Python, Rust, OCaml, C, Clojure)

ライブラリがなくても色付けできる

まずは実例画像を
この魅惑のレインボーう◯ちプログラムでは、サードパーティ製ライブラリは使っていませんし、標準ライブラリも特に使っておりません。色に関するコードは以下のようになっています。

2019/08/18

Rustでcar/cdr

Rustでcar/cdr的なもの

Rustでcar/cdr的なものは無いか?

fn main() {
    let v = vec![1, 2, 3, 4, 5];
    let (hd, tl) = v.split_first().unwrap();
    assert_eq!(hd, &1);
    assert_eq!(tl, &[2, 3, 4, 5]);
}
split_firstは、Option<(&T, &[T])>を返します。これを利用すればcar/cdr関数と同じように処理できます。split_first_mutというものもあり、こちらはミュータブルな参照を返します。car/cdrという名前で使いたい場合は以下のような関数を作成すればいいかと思います。


2019/06/27

Rustの書籍紹介

増えてきたRustの日本語書籍

ここ最近、Rustの日本語の書籍の動きが徐々に活発になってきているようです。現在、6月28日発売の書籍を含めると以下の3種類になります。もちろんまだ他の言語に比べると少ないことは間違いないですが、今後おそらく増えていくことは間違いないでしょう。もと書店員の感覚で考えると、3種類あると、「あれ?これって流行っているのかも?」と何となく意識し始めます。