ml archive (blade/ruby)
数値の型変換を行うメソッド。数値計算のメソッドは自分の知らな
いインスタンスが引数として渡された時にはcoerce
メソッドを使って変換を行うように取り決められている。
coerce
メソッドは引数として与えられた値(を変換し
た値)と自分(必要ならば変換した値)のペアを返す。
Rubyのライブラリの数値型の変換順序は
Fixnum -> Bignum -> Rational -> Float -> Complex
になっている。
CレベルのポインタをRubyオブジェクトとして見せるためのラッパー。 Cポインタと、mark関数、free関数から作る。Cを使ってRubyに機能 を追加しようとする人はぜひこのクラスの使い方をマスターする必 要がある。逆にいうとそういう予定のない人には用事がないクラス でもある。
defined?
いろいろなもの(式)が本当に定義されているかどうか調べてくれる
演算子。定義されていなければnil
、定義されてい
ればその式の種別を示す文字列を返す。defined?
は
メソッドのようにみえるがRubyの文法に組み込まれた演算子で、引
数の評価を行わない。よって
defined? print("abc\n")
はなにも出力しない。
オブジェクト指向プログラミング言語。matzは昔この言語の作者の
本(Object-oriented Software Construction 邦訳「オブジェクト
指向入門」)を読んで目から鱗が落ちたらしい。その割にはRubyは
Eiffelに似ていない。似ているのはブロックがend
で
終るところと、rescue
という予約語だけか。
end
ブロック構造を終える予約語。ある統計によればRubyを最初に見た 人の33%がこれを見てPascalを連想するという(嘘)。しかし、実際 にはbeginと対にならないこの形式はPascalというよりAdaやEiffel に近い。
RubyがCやPerlで慣れ親しんだ {}
を使わなかったの
は以下の理由である
単文・複文問題の回避
たとえばCでは
if (a==b) c();
に文を追加しようとして
if (a==b) c(); d();
などとするとややこしいバグの元になる。この問題はPascalにも存 在する。
ぶらさがりelse
問題の回避
上記と類似だが、
if (a==b) if (c==d) foo(); else bar();
などと書いてしまうと面倒なことになる。上のプログラムは実は
if (a==b) { if (c==d) foo(); else bar(); }
という意味である。
可読性の向上
異論はあるようだが、endという単語でブロックを閉じた方がプロ グラムが読みやすいと考えている人がいる。
begin
, case
の構文上の問題
正直言うと、matzはendという名前の変数を使おうとして痛い目に
あったことが何度かある。そこで、一度は { }
を使っ
た文法にしようと検討したが、begin
とcase
の文法がきれいにまとまらずに断念した。実をいうとこれが最大の
理由であったりする。
ENV
環境変数をアクセスするためのHash と同様の動作をするオブジェクト。実際には特異メソッドを付加し たObjectクラスのイン スタンスである。このオブジェクトによって 環境変数を変更すると、 Rubyの子プロセスにも引き継がれる。
よくある質問とその答え集。 Ruby FAQはまだまだ発展途上である。質問と答えは随時募集中。
Rubyにないもの。gotoがないのはそれが「あるべきでないから」ではなく、
「実装するのが面倒だったから」である。
gotoの代りはcatch/throw
や例外で実現する。
main
トップレベルでのself。
self
がないわけにはいかないので、ただそこにある
ためだけの単なるObject
クラスのインスタンスであるが、
Objectクラスを操作するため、いくつかの特異メソッドを定義して
ある。
定義されている特異メソッド
Rubyの作者。まつもと ゆきひろとも言う。 <URL:http://cmail.sourceforge.jp/> と3人の子供の父親でもある。
アイスクリームにいろんなものをまぜて新しい味を作ること。転じ てモジュールをクラスに混ぜて機能を追加 すること。継承を参照。
Rubyでは多重継承を採用せず、is-aの関係のための継承と、機能の 共有のためのMix-inを用意している。これは多重継承を濫用すると 関係が混乱するというmatzの信念のためである。
何だったっけ?
Principle of least surprise
Rubyのライバル。「年を経た蛇」。matzがPythonに満足していれば Rubyは生まれなかったであろう。一番気になっているのは名前の長 さ(6文字)である。
Ruby Application Archive(RAA)
Ruby Change Request
Ruby Document
オブジェクト指向スクリプト言語。Rubyの名前は「Perlに続く (pearlは6月の誕生石、Rubyは7月の誕生石)」という程度の意味で 名付けられた。Rubyは別に何かの略ではない。
オブジェクト指向プログラミング言語。matzは EiffelよりもSatherが好きだ。しかし、 SatherもやっぱりRubyには全然似ていない。
self
レシーバを参照する式。なぜ
self
かというと、メソッド
を動詞と考えるとレシーバは主語に当たり、メソッドから見ると
自分であるからという説があるが、Rubyでは深
く考えず、単にSmalltalkを真似ただけ
だ、という説が有力である。
super
オーバーライドしたメソッドから上位のメソッドを呼び出す方法。 引数を省略した時には呼び出し元のメソッドと同じ引数で呼び出さ れる。
問題:
引数として与えられた変数の値を変更した場合には、
super
で元の値が渡るか、変更した値が渡るか。
def foo(a) print a end def self.foo(a) a=25 super end foo(5) # 5 or 25??
答え:
変更した値(25)*1
もとはThread of controlの略。一連の制御の流れのこと。Rubyでは 一つのプログラムの中に複数のスレッドが存在できる。
undef
メソッドを未定義状態にすること。継承
もMix-inもクラスにメソッドを追加するこ
とだが、undef
を使えばメソッドを取り除くことがで
きる。ただし、クラスの実装に必要なメソッド(メソッド内部から
呼ばれているメソッド)を外してしまうと痛い目に遭う。
ブロック付きメソッド呼び出しのこと。 ブロック付きメソッドは当初繰り返し処理を行うために作られたため、 未だにイテレータと呼ぶことがある。 繰り返しを意図したメソッドをイテレータと呼ぶのはかまわないが、 ブロック付きメソッド呼び出し全般をイテレータと呼ぶと混乱の元 になるので気を付けるように。
オブジェクトのこと。オブジェクトがある クラスに所属することを強調する意味あいがあるらしい。オブジェ クトなんだかインスタンスなんだか混乱してオブジェクト指向に挫 折する人は多いと聞く。
オブジェクトに固有の変数のこと。Rubyのインスタンス変数は識別
子の直前に@
をつけたものであり、メソッドの中から
しか参照できない。
再定義のこと。スーパークラスまた はincludeしているモジュールで定義され ているメソッドと同じ名前のメソッドを定義すること。オーバーラ イドした上位のメソッドは superを使って呼び出すこと ができる。
もののこと。「愛」は多分オブジェクトではな いが、「ラブレター」はオブジェクトである。あるものがものであ るか、そうでないかは多分に哲学的である。この辺がオブジェクト 指向は難しいといわれる原因かも知れない。コンピュータ業界では メモリ中の特定の空間のことをオブジェクトと呼ぶ人がいたりする 人がいる。困ったものだ。カプセル化、 抽象データ型参照。
オブジェクトを基本にしたパラダイム。 英語の"Object-Oriented"という形容詞が、日本に来て名詞化した。 オブジェクトを考え方の中心に置けば、なんでも良いようにも思え るが、一般的には
が必要らしい。 なんでも解決できる「魔法」のように考える人もいるが、世の中そ んなに甘くない。誕生から20数年を経てようやっと実用的に使われ るようになった…んだろうな、多分。
オブジェクトを基本にしたシステム設計
オブジェクトを基本にしたプログラミング。
オブジェクトを基本にしたシステム分析。
データに対する直接的な操作はデータの型に付随する特定の手続き (メソッドと呼ぶ)からだけ行うことにより、 内部構造や処理のアルゴリズムを外部から隠してしまうこと。 抽象データ型参照。
Rubyはインスタンス変数はメソッドからしか参照できないので、カ プセル化が強制されているといえる。
親プロセスから子プロセスに対して受け渡される値。 ENVでアクセスされる。 子プロセスに渡るのは環境変数のコピーなので、子プロセスから親 プロセスに環境変数を使って情報を受け渡すことはできない。 親はなかなか子供に耳を傾けないものである。
厳密にいうとRubyに関数はない。しかし、レシーバを省略したメソッ ド呼び出しは外見が関数に似ているし、 selfやインスタンス変数など レシーバの情報を全く参照しない事実上の関数として働いていると いっても良いメソッドもある。だから厳密でない言い方としてそう いうメソッドを関数と呼ぶこともある。
そういう関数(的メソッド)は大抵レシーバを省略した形式でしか呼 び出せないように可視性がprivateに 設定してある。このようなメソッドの代表として モジュール関数がある。
クラスのメソッド。全てのクラスのクラス
Classで定義されている
全てのクラスで共有されているメソッドとクラスそれぞれが固有に持っている
特異メソッドとがあるが、そんな
ことは大した問題ではない。
クラスメソッド内でのself
はクラスであるので勘違いしないように。
プログラム全体から参照できる変数。危険。多用しないこと。
先祖や親戚から受け継いだものに頼り切って、 自分では最低限のことしかしないこと。現実世界では嫌な奴。 転じて、あるクラスに機能を追加した新しいクラス を作ること。継承はis-aの関係を表現するのに有効である。たとえ ば、学生一般の性質を記述した「学生」クラスを継承して、実験に 苦しめられる「工学部生」クラスを作ることができる。is-aの関係 がなく、単に性質や機能を共有する場合にはMix-in を使うことが望ましいとされる。
オーバーライドのこと。
項目からその定義を取り出すことができるもの。転じて ハッシュの別名。オブジェクト指向の起源と も呼べるSmalltalkにおいてハッシュに 相当するデータ構造が「辞書」と呼ばれていたせいで辞書という用 語になじんでいる一群の人々がいる。
オブジェクト(あるいは「なにか」)を「使える」状態にすること。
インスタンスの初期化には
Object#initialize
メソッドを再定義する。クラスのメソッド
Class#newのデフォルトの
定義は新たに生成したインスタンスに対して、
initialize
を実行する。new
への
引数はそのままinitialize
に渡される。また、
new
がブロックとともに呼び出された時には
initialize
にそのブロックがそのまま与えられる。
ということはClass#new を再定義する必要はないはずだ。
台本。転じて、インタープリタが解釈する比較的短いプログラムの こと。もちろん中には超大作の台本もある。
スクリプトに従ってバッチ処理を行うイン タープリタのこと。人間も台本を読むという点においてスクリプト 言語である。
参照ではなく、実際の値が変数に格納さ れるもの。Rubyの現在の実装ではFixnum、Symbolとnil/true/falseだけが即 値である。しかし、Fixnumが即値でないRubyの実装があっても構わ ないし、モデル上全ての値がオブジェクトへの参照であると考えて も差し支えない。
順番に並べ替えること。Ruby は数え上げる事ができて
(Enumerable
がincludeされていて)、各要素に順序
が定義されて(<=> が定義されて)いれば、配列に限らずどん
な複雑なオブジェクトの集まりもソートしてくれる。
break,
next,
redo,
retry,
return
などのメソッドの範囲内での脱出ではなく、捕捉されない限りメソッ
ド呼び出しの階層を遡って中断するタイプのものを大域脱出と呼ぶ。
Rubyの大域脱出には、例外によるものとcatch/throw
がある。
ほとんどの例外は(exit
で発生するSystemExit
を含めてrescue
で捕捉できるが、捕捉することに意味がない例外
(例:メモリ割当に失敗した/インタプリタそのもののバグ)は
捕捉の対象にならない。
catch/throw
はthrowされると指定されたタグと同じ
タグを持つcatchまで一気にジャンプするものである。
ローカル変数 の一種。Rubyのローカル変数はスコープが 静的に決まるためコンパイル時に変数が作成されるが、ダイナミックローカ ル変数は、実行の都度変数が作成される。ブロックの中で初めて代入された ローカル変数はダイナミックローカル変数となり、そのスコープはブロック の中だけとなる。これは、Thread 毎に独立した変数を持 つためにある。
データの構造とそのデータに対する操作をひとまとめにしたものを 抽象データ型と呼ぶ。抽象データに対する操作は必ずその操作を経 由する必要がある。結果、データ構造は外部からは直接参照されず、 内部構造の変更が外部に悪影響を及ぼさない。このことを カプセル化と呼ぶ。
一度定義したら値を変えることができない変数。 でも、この定義は矛盾しているなあ。
操作の対象のデータ型に合わせて適切な手続き(メソッド)が実行時 に選択されること。プログラムの柔軟性を高める働きがある。 オブジェクト指向の要件のひとつ。 Rubyでは変数に型が無いので動的結合は必然である。
ある特定のオブジェクトだけのための仮想的なクラス。
ある特定のオブジェクトにだけ定義されたメソッド。 メソッド参照。 特異メソッドは以下の場合に他のオブジェクトにも引き継がれる。
特異メソッドで元のクラスのメソッドをオーバーライドした場合は もとのメソッドはsuperで呼び 出すことができる。
matzの苦手なもの。彼は普段から「ソースがドキュメントだ。バグ も完全に記述されている」と主張しているが、誰も受け入れない。 当り前だ。
クラス/モジュール定義の一番外側のコンテキスト。Rubyスクリプトはトップレベルの コンテキストから処理が始まる。
いきなり、
print "on Toplevel"
というスクリプトを書いたとき、print メソッドはトップレベルから呼ばれている。
0x01020304
という4バイトデータを1,2,3,4
と配置するか、4,3,2,1
と配置するかということ。前
者をビッグエンディアン、後者を
リトルエンディアンと呼ぶ。どちらが
良いかという論争は時のはじめから続いていてまだ結論が出ていない。
String#chop!, Array#concat などの メソッドは、レシーバの状態を変化させるので、 「破壊的な作用をする」という。 めったにコンピュータを壊すことはない。
Rubyにおけるキーから値へのマッピングを表すデータ構造。 連想配列とか 辞書とも呼ばれる。ハッシュがハッシュ と呼ばれるのはその実現に「ハッシュ表」と呼ばれるアルゴリズム が使われているからである。ハッシュというのは「切り刻む」とい う意味で、「ハッシュド・ビーフ」の「ハッシュ」である。
「考え方」の難しい表現。素直に分かりやすい言葉を使えばいいのに…。
アメリカ大陸原住民…はインディアン。 こっちはエンディアンで語源はスウィフトの「ガリバー旅行記」に出て来る 卵を丸い端から食べる人たちである。 当然、尖った端から食べる人たちは リトルエンディアンである。 コンピュータ業界ではCPUなどがデータを並べる時の形式のひとつで、 ネットワーク族はビッグエンディアンを好むという。 バイトオーダー参照
Rubyインタプリタ組み込みでインスタンスの構造が 通常のオブジェクトと異なるクラス。 これらのクラスを継承したクラスを定義することはお勧めしない。 Rubyのビルトインクラスは以下の通りである (本当はもっとあるけど気にしないように、ちゃんと 組み込みクラス/モジュール/例外クラス に列挙されてるのだから)
ループを構成したり、家や塀を建てたり、人を殴ったりするもの。
コードの集まり(ブロック)を受け取ることのできるメソッドを ブロック付きメソッド呼び出しと呼ぶ。
ブロック付きメソッドの中ではyieldを使って ブロックを実行することができる。
当然のことながら、与えられたブロックをどのように処理するかは メソッド側に委ねられている。ので、内部でブロックを評価しない メソッドにブロックを与えてもなにも起きない。エラーも起きない。
オブジェクトにつける名札。Rubyの変数には グローバル変数、 ローカル変数、 インスタンス変数がある。 それと定数は値を変えることができない ので、変数ではないが、名札であるという点に おいては変数と同じである。
対象になるオブジェクトによって実際の操作が決定されること。 Rubyではレシーバのオブジェクトに応じ てメソッドが選択されることによって実現されている。
例
obj = "abc" print obj.length, "\n" # => 3 obj = [1,2,3,4] print obj.length, "\n" # => 4
関数のように用いられるメソッドの中で、 モジュールのメソッドとしても、特異メソッドとしても定義されて いるものはモジュール関数と呼ばれる。例えば Mathモジュールのほとんどのメソッドは モジュール関数である。これらのメソッドは、例えば
Math.sqrt(2)
という形式でも
include Math sqrt(2)
という形式でも使えて便利である。
オブジェクトに対する操作。操作対象のオ ブジェクト(レシーバ)は selfで参照できる。 Rubyの場合ビルトインクラスのオブ ジェクトを除けば、オブジェクトの構造は動的に決まるので、ある オブジェクトの性質はそのオブジェクトに定義されているメソッド によって決定される。
最初10人いて段々減っていく。コンピュータ業界ではデータを並べ る時の形式のひとつで、非常に大きなシェアを持つあるCPUメーカー はリトルエンディアンを好むという。バイトオーダー参照
例外的な状況で発生するもの。例外が発生すると
beginの
rescue
節を使って明示的に捕捉されない限り、
呼び出し階層を遡ってプログラム(thread)の実行は中断される。例外の
おかげでRubyプログラムはほとんどの場合例外的な状況についていちいち
チェックせずにすむ。例外の発生した場所の情報は
$@に、例外そのものに関する情報は$!
に格納されている。
メソッドの実行主体。メソッド呼び出し式の`.
'の左
側にあるもの。メソッド内では
selfで参照できる。レシーバ
のインスタンス変数は
@変数名
という形式でアクセスできる。
ハッシュの別名。ハッシュが任意のキーから 値を取り出すことができるので、「連想」と、またハッシュは添字 が数字でない配列とみなすことができるので「配列」と呼ぶらしい。 昔々は連想配列(連想記憶と呼ばれていた)はハードウェアによって 実現されるものだと考えられていたが、計算速度の向上や適切なア ルゴリズムの発見(「ハッシュ表」と呼ぶ。ハッシュの語源)により ソフトウェアのみによって実現されるようになった。
ある範囲内でのみ参照可能な変数。その範囲をスコープと呼ぶ。 Rubyのスコープは
で、ブロックだけは外側のスコープのローカル変数もアクセスでき る。ローカル変数の有効範囲はスコープでの最初の代入が現れた場 所からスコープの終りまでである。有効範囲は静的に決まり、実際 に実行されるかどうかは関係ない。
*1古いバージョンでは 5 を返すという仕様だった。現在
はこの問題自体にあまり意味がないかも知れない