LoginSignup
12
10

More 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 は「無茶苦茶やりまくる」という意味でオススメしづらい……学習コスト高い上に追従コストが悲惨……
12
10
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
10