クラス定義、クラスインスタンス変数、特異メソッド

クラス定義の中身 クラス定義では、クラスがカレントオブジェクトselfの役割を担う。 class MyClass puts 'hello!' end 次のようにも書ける result = class MyClass self end result # => MyClass Rubyのプログラムは常にカレントオブジェクトselfを持ってい…

クロージャ

クロージャの書き方をよく忘れてしまうので書いておく引数を加算するクロージャ def acc x = 0 f= lambda {|n| x+= n} return f end ac_obj = acc ac_obj.call(3) #=> 3 ac_obj.call(3) #=> 6 引数を乗算するクロージャ def mlc x = 1 f=lambda {|n| x*= n} …

便利なメソッド map, group_by, enum_for, inject

勉強会に参加してrubyの便利なメソッドを使った書き方を学んだのでメモする。 map 配列の要素に操作をする場合に使う。 "abcdef".split.map{|e| e.capitalize} => "A","B","C","D","E","F" "abcdef".split.map{|e| e.capitalize}.min => "A" group_by 配列を…

Proc

ブロックはオブジェクトではない。ブロックをオブジェクトに保管して後で実行するには、Procを使う。 inc = Proc.new {|x| x+1} inc.call(2) #=> 3 この技術を遅延評価という。 Proc.new以外にlambda,procのカーネルメソッドも使用できる。ブロックは通常、…

スコープ、instance_eval

スコープのフラット化 プログラムがスコープを切り替えて、新しいスコープをオープンする場所はクラス定義、モジュール定義、メソッド呼び出しの三個所。それぞれclass, module, defキーワードで印がつけられている。三つのキーワードはそれぞれスコープゲー…

動的ディスパッチ、動的メソッド、method_missing

動的メソッド メソッドを動的に呼び出すにはドットではなくObject#sendを使って呼び出す class MyClass def my_method(my_arg) my_arg * 2 end end obj = MyClass.new obj.send(:my_method, 3) #=> 6 コードの実行時に呼び出すメソッドを決めている。この技…

オブジェクトモデル

オープンクラス 既存のクラスをオープンしてメソッドを追加すること class String def to_alphanumeric gsub /[^\w\s]/, '' end end 既に同名のメソッドが存在するのに、オープンクラスで追加してしまうとエラーになる。何も考えずにクラスにコードを追加し…

文字列

文字列リテラルは以下5つある。 シングルクォート ダブルクォート %Q %q ヒアドキュメント シングルクォート 文字列が式展開を含まないときに使う p 'question #{a}' #=> "question #{a}" ダブルクォート 文字列が式展開を含むときに使う。 p "double quote …

Module, Mixin

モジュールとはメソッド、クラス、定数をグループ化する方法の一つ。モジュールをincludeすることでMixinが実現できる。mixinされたモジュールはスーパークラスとして動作する。 class Person include Comparable attr_reader :name def initialize(name) @n…

トランザクション、オブジェクト、クロージャとしてのブロック

トランザクションとしてのブロック ファイルを開き確実にクローズ処理をする場合もブロックを使うと簡単に書ける。 class File def self.open_and_process(*args) f = File.open(*args) yield f f.close() end end File.open_and_process("TestFile", "r") d…

Enumerator-外部イテレータ

RubyでもJavaのような外部イテレータを作成することができる。配列、ハッシュなどのコレクションに対してto_enumメソッドを呼び出すことでできる。 a = [1, 3, "cat"] h = { dog: "canine", fox: "lupine" } enum_a = a.to_enum enum_h = h.to_enum enum_a.n…

配列、ハッシュ、ブロック、イテレータ

配列 まずは配列 a = [1, 3, 5, 7, 9] a[-1] # => 9 a[-2] # => 7 a[-99] # => nil 後ろから指定することもできるインデックスを[start, count]で指定する。startからはじまるcount個のオブジェクトへの参照が返る a = [1, 3, 5, 7, 9] a[1, 3] # => [3, 5, …

クラス、オブジェクト

クラスは以下のように定義する。 class BookInStock def initialize(isbn, price) @isbn = isbn @price = Float(price) end end b1 = BookInStock.new("isbn1", 3) p b1 インスタンス変数は@で宣言してますね。 initializeはオブジェクトを初期する関数です…

ls2

次のプログラムは前回のlsコマンドの出力内容を改善し、ファイルモード、パーミッションを文字列で表示する ls2.c #include <stdio.h> #include <sys/types.h> #include <dirent.h> #include <sys/stat.h> #include <string.h> void do_ls(char []); void dostat(char *); void show_file_info(char *, struct stat </string.h></sys/stat.h></dirent.h></sys/types.h></stdio.h>…

ls1

lsの動作 lsはコマンド行引数がディレクトリならその内容をリストアップし、ファイルならその名前や属性を表示する。 ディレクトリとは、ファイルとディレクトリの名前のリストを含む一種のファイルである。ディレクトリはプレーンテキストを格納していない…

平衡木(赤黒木)

ランダム化BSTとスプレイ木はどちらも特殊な探索が線形時間となる可能性がある。そのため、根から外部節点への距離がすべて等しくなるような木構造を考える。2分探索木のノードに赤か黒の色をつけ、以下の条件を満たすものを赤黒木と呼ぶ ノードは赤か黒 根…

平衡木(スプレイBST)

挿入時に左右の回転を使用して新たな節点を根にするという動作に加え、回転がある意味で木を平衡させるように根への挿入を修正する。 新しい節点を木のトップに持ってくる単純回転を使う代わりに、節点を根の孫の位置から木のトップに移動する二つの回転を行…

平衡木(ランダム化BST)

BSTの平衡化 次のプログラムは分割関数を使用しBSTを完全に平衡させる。中央値を根において分割し、部分木に対しても再帰的に分割を行う。 link balanceR(link h) { if (h->N < 2) return h; h = partR(h, h->N/2); h->l = balanceR(h->l); h->r = balanceR(…

根への挿入,BSTの選択、分割、削除

根への挿入 BSTの標準的な実現では新しい節点は木の底だが、次のプログラムはトップに配置する。これを実現する為に、木に対して回転を行う。 右回転は根を右側におく。根の左リンクは回転前は根から左の個へ向いているが回転後は、左の子(新しい根)から古…

間接的2分探索木

2分探索木で項目を移動せずに項目を見つけやすくするため索引(index)を使う。 例えば、配列の添字をBSTの項目として使用し、keyマクロを通して項目からキーが取り出せるようにする。 #define key(A) real key(a[A]).このやり方を拡張して、リンクを配列の…

二分探索木

挿入操作が高くつくという問題を解決する為に、記号表の実現に木構造を使用する。これによりsearch,insert, select, sort操作に対して高速な性能を持つアルゴリズムを開発できる。 用語の説明 節点は他の節点あるいは外部節点(リンクを持たない)を指すリン…

二分探索法

二分探索法は配列を用いた逐次探索に分割統治法を適用した探索手続きを用いること。次のプログラムは配列による記号表を二分探索で実現したもの。 #include <stdlib.h> #include "Item.h" #include "ST.h" static Item *st; static int N; void STinit(int maxN) { st </stdlib.h>…

記号表(逐次探索)

次のプログラムは記号表を実現するのに、配列を使用するが空の項目はない。あたらしい項目を挿入する時は、挿入整列と同様にそれより大きな項目を一つずつ右に移動して配列を整列しておく。探索はすでに整列されている配列を操作するので、探索キーより大き…

記号表(キー添字探索)

記号表はキーをもつ項目からなるデータ構造。新しい項目を挿入する、与えられたキーを持つ項目を返すを提供する。記号表のインターフェースは以下の操作を行う必要がある。 insert, search, delete, select, sort,次のプログラムはキー添字配列に基づく記号…

logout. lseek

カーネルは、ハードディスクとメモリの間でのデータ転送にかかる時間を節約するため、ディスクブロックのコピーをメモリ内で管理している(カーネルバッファ)。カーネルはディスクからカーネルバッファにブロックをコピーする。プロセスが特定のファイルの…

バッファリング

システムコールに時間がかかる理由 バッファサイズによって読み書きのシステムコールの回数が変わる。システムコールには時間がかかるため、回数の多いプログラムは実行時間が遅くなり他のユーザーが使いたい時間を占有してしまう。 システムコールに時間が…

cp

whoでファイル読み込みを学んだが、ファイル書き込みするにはどうするか?それを学ぶためにcpコマンドを作成する。 ファイルを作成したり、書き換えたりするための手段はcreatシステムコールを使う。 int fd = creat(char *filename, mode_t mode); createシ…

who

次のプログラムはwhoコマンド。whoはログインセッションを表示する。 whoはutmpファイル(OS Xの場合はutmpx)を呼んでいる。 utmpファイルはutmpエントリの連続になっている。utmp.hにutmpエントリは定義されている。ファイルから構造体を読み出すにはどうす…

more

UNIXの勉強の続き。この本を勉強するUnix/Linuxプログラミング理論と実践作者: Bruce Molay,長尾高弘出版社/メーカー: アスキー・メディアワークス発売日: 2008/04/21メディア: 大型本購入: 9人 クリック: 280回この商品を含むブログ (47件) を見る一章はOS…

ビット処理

C言語でbit処理をするときのメモ 論理積 short型の変数に格納された任意の値の最上位ビット(MSB)が1かどうか調べるにはp&0x8000という演算を行う。MSBに1がたっていたら結果として0x8000が返され、立っていない場合0x0000が返される。 short p = 0x8fff; if …