infoMore than 5 years have passed since last update.
Ruby の特性を別言語話者(?)から見てみる
Last updated at Posted at 2018-05-31
どんな言語なの?
- 日本人が作った。おお、我らが Matz 、島根の誇りよ。いや生まれは鳥取らしいけど。
- Perl に似ている。
- というか、「Perl のろくでもないところをなんとかしたのが Ruby」というような記述をどこかで見た。気がする。
- 「Matz が Python で満足してたら Ruby はない」と言われる。別に Matz が Python 嫌いということではない。満足してたらって書いてあるしね。
- リスト内包だか高階関数群だかの記法が嫌らしい。というようなことをブログで見た。斜め読み。
- 個人的な話だが全面的に同意する。リスト内包はややこしくなりがちだし、map(proc, items) より items#map(proc) のが直感的だよね。同じ不満を抱いて JavaScript へ逃げたんだよなあ。
- 初登場は95年、実は PHP と同い年である。意外にも古株。
- 2004年の Rails 登場以降爆発的に普及した。
- ……んじゃないかと思う。それまで名前も聞いたことがなかった。
- それ以前でも国内では割と広まっていたらしい。
- 最初期は newsgroup fj で発表されたものらしいので、単に観測範囲のジェネレーション・ギャップかもしれない。
文法系
- 行終端記号;、ブロック終端は end (始点は def やら if やらいろいろ - Ruby的に「ブロック」は別の意味を持つのでちょっとめんどくさいが、これは制御的な意味の方) 。
- コメントは Shell/Perl 型単行(つまり #) 。
- いろいろ省略できる。
- 特にメソッド呼び出しの括弧を略せるのは混乱しがち。むしろ省略がデフォなレベルらしい。なにそれこわい。
- 行終端だって省略できる。というか使ってるところを見ないもんだから終端記号なしなパターンだと思っていた。
-
インクリメント、デクリメントは存在しない。
- ほかはそこまで特殊というわけでもない。+= だってある。
- 頭文字が大文字な変数は定数扱い。
- const なんてものはない。
- というか、変更しようとすると警告が出るだけの変数である。警告してくれるだけありがたいといえばそう……なのか?
- do - while は
ない。 あるにはあるが matz 直々に使うなとされている。それで reject されたなんて記事があったのか。
- キーワード do は (lambda か何かのような) メソッドへコード片を渡す存在 "ブロック" のために存在する。
-
なお do - while 同等の代替品は存在しない。if + break で書いて。
- 変数宣言はない。スクリプト言語はみんなこんなんだな。
-
全てはオブジェクトである。OOP バンザイ。
-
全ての式と文は値でもある。
- if 文で値2種を選択的に代入したい!というとき、なんとまるで if 文自体を代入するかのような記述ができる。条件演算子だと辛い時にどうぞ。
-
Duck Typing 万歳、メッセージ指向万歳。詳細は後述。
オブジェクト / クラス
-
何でもかんでもだいたい可変。文字列ですら可変。
- クラスにメソッドを「後付け」することだって出来る。
- 拡張メソッドどころではない。ガチでメソッドが増えるし書き換えられる。
- というかインスタンスにだって後付け出来る (特異メソッド) 。JavaScript かな?
- もちろん組み込みクラスだって可変。やっぱり JavaScript かな?
- 流石に変更を禁ずる freeze というものが用意されている。
- とはいえ、見苦しいし不便になるので乱用するとキレられる。そりゃそうだろうけど、Java でいう final みたいな感覚なんだろうか。
-
演算子の多くはメソッド呼び出しのシンタックスシュガーである。かっこいい!!
- クラス変数は @@ 、インスタンス変数は @ が頭につく。
- なおグローバルは $ 。
- ローカルはつけなくていい。
- これに限らないが、「よく使うものは手軽に、使わずに済むならその方がいいものは面倒に」というのが一つの哲学のようだ。
- メソッド定義は def - end
-
メソッド名に ! や ? を使える。最後に付けて特性を示すのがお約束。
- ! は (特に同名のものと比較して) 破壊的変更を伴うことを意味する。
- ? は真偽値を返すものを意味する。Java でいう isXXX とか hasXXX とか。
- 文法的な強制力はない。
- そもそもメソッド名に予約語を使うことさえ出来る。予約語、予約語って何だ。
-
定義されていないメソッドを呼び出せる。
- 定義されていなかった場合、「定義されていなかったときに呼ばれるメソッド」が代わりに呼ばれる (method_missing) 。Duck Typing もここに極まれり。
- null ではない、 nil だ!
- コンストラクタはクラス名ではない、initialize だ!
- 単一継承。ただし mix-in がある。
- インスタンスメソッドを片っ端から "継承" 出来る。
- しかも最終的に "継承リスト" という同一のものの上で管理される。
ちょっと特殊な存在、シンボル
- :hoge みたいなやつ。
- 文字列と整数値の中間的存在。
- 見た目は文字列、内部的には数値。
- 見た目同じなら同一オブジェクトであることが保証されている。
- この特性のおかげで比較やらなにやらが速くて高効率。オブジェクトその他の管理に使われる。
- あるオブジェクトにあるメソッドが存在するかチェックする respond_to? とかで使う。
- 文字列も受け付けてくれるが、シンボルのが速いらしい。そりゃそうだ。
やたら処理系が広範
- なんと組込み用実装まで存在する。
- 大本は Shell 用言語のつもりだったらしい。つまりもちろん Perl のノリで使える。
- でもやっぱり広まった最大の原因は Rails じゃなかろうか。アレはもう Rails っていうひとつの処理系だよね (強弁) 。
- でも個人的には Rails は「無茶苦茶やりまくる」という意味でオススメしづらい……学習コスト高い上に追従コストが悲惨……
List of users who liked
12Register as a new user and use Qiita more conveniently
- You get articles that match your needs
- You can efficiently read back useful information
- You can use dark theme
What you can do with signing up