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