プログラミング言語
http://www.ruby-lang.org/ja/
目次 †
感想 †
- ちょっとしたスクリプトを書くのには適している。
- 大規模開発で使うにはちょっと難しいかと。
- Perl よりははるかにまとも。
- サーバーによってはインストールされていないケースがあるので要注意。(Perl だとたいてい入ってるんだが…)
- イテレータの書式がどうにも気持ち悪い… 代入記述不要にして、スコープを明確にするとこうなるしかないんだろうか?
- イテレータは最近は「ブロック付きメソッド」とか呼ばれるようだ。こちらの方が実情に沿っている。名は体を現す。
- いまだにマニュアルに演算子の説明がまともに書かれないのは、初心者お断り? 先に Perl やっとけってこと?
- オーバーライドされるので、各々のクラスで確認しろというのが見解らしい。
- 困ったとき、a << b なら、p a と p b してクラスを特定してみる。
- 公式マニュアルがいまいち。誰かが勝手につけた名前見ただけで自分の目的のものを見つけられるほど、我々は賢くないのです…
特徴 †
- インタプリタ
- オブジェクト指向
- すべてオブジェクト
- 弱い型付き言語
- インスタンスには型がある。変数には型がない。静的型チェックがない。
変わった特徴 †
- 既存のクラスに外のモジュールからメソッドを追加することができる。
- 特定のインスタンスに対してメソッドを追加することができる。(特異メソッド)
- イテレータの書式が変わっている。いわゆる無名関数の受け渡しになっているが、単純な関数定義形式をとらず、特殊な構文になっている。(たぶん初心者は理解できずにつまづくと思う。)
- もしも、イテレータに複数のブロックを引き渡したくなった場合には、proc で手続きオブジェクト(クロージャ)にする。
- ここは正直言って言語仕様が歪んでいる部分。イテレータが特別扱いと見たほうがよい。
- 1.9 からはイテレータのブロックが proc オブジェクトと同義とみなされるようになっている。(実験的実装)
C/C++/Java プログラマが気をつける点 †
- 行末に ";" は不要。
- メソッドの "f(x)" の括弧 "(" ")" は、曖昧でなければ省略可能。
- ただ、その場の気分で付けたり外したりするとろくなことにならないので、付けっぱなしがよいと思う。
- 数値もオブジェクト。論理値もオブジェクト。プリミティブ型のようなものはない。
- int, long のような表現限度がない。整数(Integer)は多倍長整数(Bignum)と固定長整数(Fixnum)があるが、自動拡張される。
- +1 し続けても、負値には決してならない。
- メモリのある限り拡張され続けるので要注意。
- 浮動小数点数(Float)は double と同じ精度。
- double 以上の精度が欲しい場合は、Integer と位取りを使って処理。
- インクリメント(++)/デクリメント(--)演算子はない。
- x += 1 とかする。
- (C++を見れば実装困難ではないと思うが、作者は {t = t + 1} と完全等価であるべきだと考えているようだ。「言語」だけを考えた結果だろう…。syntax sugar なんだから、そこまで厳密である必要は全然ないんだが。というか、++/-- は+/-とは別演算子として実装してくれないと再定義の時に非常に困る。)
- false と nil が偽、それ以外はすべて真。0 も真とみなされる。
- Java の String と違って、Ruby の文字列(String)は不変オブジェクトではない。
- Ruby には「関数」はない。すべてクラスメソッドとなる。クラスを明示しないので、関数のように見える。
- いわゆる else if の場合、elsif を使う。case when (switchの代替)も検討せよ。Ruby の
場合、数字以外も判定に使用可能。
- return 文がない場合がある。return 文がない場合は最後に実行された式の値がメソッドの結果となる。(検索が大変かも…)
- void f(x) はできない。常に値(最後に実行された式の値)が返る。
- 内部情報が漏れるので、セキュリティ上、問題になる可能性がある。
- void を返したい場合は return nil する。
- this ではなく self を使う。
- main メソッド(関数)はない。ファイルの先頭から実行開始される。このとき自分自身(self)は main オブジェクトである。
C++ プログラマが気をつける点 †
- 多重継承がない。代わりに Mix-in を使うこと。
Perl プログラマが気をつける点 †
- 「$変数名」はグローバル変数(要注意!)。「変数名」はローカル変数。
- ローカル変数は必ず初期化代入が必要。
- 文字列への埋め込みは #{変数名}
- false と nil が偽、それ以外はすべて真。0 も真とみなされる。
- リスト代入は多重代入で代用する。
- POD? に相当するのは RD?
Visual Basic プログラマが気をつける点 †
- 配列の基数は 0
- 名前付き引数(キーワード引数)はない。ハッシュとシンボルで名前付き引数もどきを作るしかない。(→Ruby/シンボル)
- 名前付き引数とは f(x:=1, y:=2) みたいなの。(コマンドオプションのように、引数の組み合わせが大量にあるときに有意義。Excel/Access VBA では結構よく使う。)
メモ †
- WEbrick より Mongrel は速い。しかし、その速さはあくまで仕様を端折っているから。