あなたがRubyを学ぶべき10の理由




海外のブログのエントリーで10 reasons to learn Rubyというものがあって、Rubyの特徴についてよくまとまってました。せっかくだから翻訳してみました。かなり長いです。

#1 特別なことをしなくてもいいとこどりできます
RubyはsmalltalkからJava,Perl,Pythonまでのもっとも優れたプログラム言語からよいところを拝借しています。基本的に、あなたが他の言語で見たことがあるような以下の特徴や機能があります。

  • 例外(Exceptions) 信 じるか信じないかは自由ですが、例外はすべての種類のアプリケーションを作るときにマスターすべきもっとも重要なものです。PHP4プログラマーはおそら く例外についてこれからも知ることはないでしょう。そして彼らはただスクリーンにprintしろとか、エラー制御のための”ものすごく進歩的な”クラスを 使えと言うことでしょう。お願いだから、それは無視してください。幸運にも私たちみんなにとって、Rubyはtry/catch (もっとよいものは, begin/rescue) ブロックと、適切にエラーを扱うための定義済みの拡張可能な一連の例外が備わっています。
  • 名前空間(Namespaces) RubyのモジュールはJavaやC++の愛好家が喜ぶような優秀で使いやすい名前空間をつくることができます。
  • ビルトインされた正規表現(Built-in Regular Expressions) すべてのPerl monkeysのように、スラッシュの間に何かを置くことができますし、それは正規表現と解釈されて=~演算子でマッチさせることができます。
  • 上書きできる演算子 (Overloadable operators) Rubyでは+,-,>などのような演算子をどんなクラスにでも定義することができます。
  • パッケージ(Packages) gemsを呼び出せば、ほんとに素晴らしいんだけど、依存関係のサポートとクロスプラットフォーム、プラットフォーム依存どちらでもできるパッケージ管理ソフトが動作するのです!
  • インタラクティブシェル(Interactive Shell) Python consoleのようなインタラクティブなRuby ShellをRubyコードのテストに簡単に使うことができます。

#2 -コンパクトなものが大好きになります
Rubyはエレガントです。なぜでしょう?Rubyはコードの可読性と利便性以上に簡潔さを重視していないからです。以下は役に立つtipsです。

  • 条件式でifとunless両方を使うことができます。もちろんifを使って条件を否定することもできます。しかしunlessはよくエラーを少なくし得るものです。さらに、宣言の前よりも後に、条件付修飾子として両方のoperatorを使うことができます。order.new unless order.exists
  • クエスチョンマークとエクスクラメーションマークをメソッドの後ろにつけることができます。何の制約もないので、メソッドがtrueかfalseを返す場 合、?を付け加えることができます。また、たとえばデータベースレコードを破壊するときやstringの最後の文字を取り除くときなど、メソッドが強制的 に何かをすると確認するために!が使われています。
  • すでに定義されているメソッドへのエイリアスを作るのにaliasディレクティブを使うことができます。この方法でノーコスト、繰り返しなしでexistexistsメソッドを実装することもできます。
  • 特定のクラスのメンバのゲッターとセッターを自動的に生成するためにattr_reader, attr_writer or attr_accessorを使うことができます。
  • あなた自身が混乱しないように(for your own sanity)、いくつかの名前の制約があります。定数、クラス、モジュールは大文字ではじめますし、メソッドとメンバは小文字ではじめなくてはなりませ ん。グローバル変数は$、インスタンス変数は@、クラス変数は@@を付け加えます。
  • メソッド呼び出しの括弧は任意です。だからFile.open(”/home/h3rald/test.txt”)と書くこともできますし、単にFile.open “/home/h3rald/test.txt “と書くこともできます。これはパラメータを複数持たないメソッドで特に便利です。

#3 - もう二度とセミコロンを使わなくてすみます
別 の命令をつけ加えたいですか?ただ次の行に進んでみてください。<return>を打って終わりです。RubyではPythonと同様、改行 は重要ですし命令をセミコロンで終えるのを覚えておく必要はありません。不運にも、これは全てのプログラムをC++folksのように一行のコードで書か ないということを意味するのです、最悪です。そうではないですか?

#4 - すべてがオブジェクトです、それがあるべき姿です
Javaを勉強しているときに私は全てがオブジェクトだと教わりました。

「なら14や374346.678もオブジェクトなんだ」
「違うよばか、それは数値(numbers)だって!」

Rubyでは、数値(numbers)・文字列(strings)・真偽値(Boolean)その他すべてオブジェクトです。つまり次のように書けるということです。

"YOU SHOULDN'T ALWAYS USE CAPITALS".lowcase#=> outputs "you shouldn't always use capitals"

次のようなものの代わりに。

# PHP Code
strtolower("YOU SHOULDN'T ALWAYS USE CAPITALS")

時間とブラケットを節約できますし、わかりやすいのです。

#5 - すべてが値を持っています
もしくは「値を返すためにreturnを使うことはもうほとんどありません」。nutshellで、すべてのRubyの命令は値を返します。変数でさえも。 ですからメソッドの終わりにreturnキーワードを使う必要は本当にありません。最後に割り当てられた値が常に返されます。

#6 - 好きなように環境を変えられます
これをはじめてみたとき、私は驚愕しました。典型的なプログラムの状況を想像してみてください。
あなたはシステムクラスか誰かが作ったクラスを使い始めて、メソッドを追加したいことに気づきました。この点において、普通のプログラミング言語だといくつかの方法があります。

  • アクセスできるなら、開発者のソースコードを変更します。この方法は通常よいアイデアではありませんので、とるべきではありません。
  • オリジナルのクラスから新しいクラスを派生させて、そこに新しいメソッドを追加します。これはよいアイデアですが、たったひとつのメソッドのためにはやりすぎです。クラス派生に伴い、他のコードも更新しなければなりません。
  • あきらめて、クラス外のどこかにメソッドを作成します。これは可能ですが、あまりエレガントではありませんしオブジェクト指向プログラミングに反しています。

Rubyでは、オリジナルのクラスに簡単にメソッドを追加することができます。オリジナルのソースに手を加える必要なく、システムのクラスにもその必要はありません。メータからフィートに単位を自動変換するメソッドが欲しいのですか?次のように、Numericクラスを単に拡張すればよいのです。

class Numeric
  def feet
    self*3.2808399
  end
end

そのときから、あなたの全ての数値はfeetメソッドを持つことになります。もともとクラスに定義してあった他のメソッドのように使うことができます。

5.feet #=> Returns 16.4041995

基本的にRubyのクラスは決して閉ざされませんし、どんなときもどこからでも変更することができます。もちろん使うときは気をつけてください。

#7 鳥と馬からペガサスは作れません、でもロバくらいなら大丈夫です
大学のときC++の教授がクラスや継承のようなオブジェクト指向の鍵となる考え方を説明するときに動物を例に使っていたのをはっきりと覚えています。彼女が 多重継承を説明するためにBirdクラスとHorseクラスからPegasusクラスを継承させたときに不可解なことが起こりました。そのクラスには flyとneighのようなメソッドがあったのです…ばかばかしい。それはともかく、Rubyには多重継承はありません。
これは結局トレンドであ るようです、そしてもちろん好みによります。多重継承は予期せぬことにつながるかもしれないので、私はそんなに好きではありません。そうは言うものの、 Rubyのモジュール使用時にはmix-insを作成することが可能になっています。結果、モジュールがincludeされている場合は、モジュール定義 されているメンバとメソッドが特定のクラスに加えられます。

#8 XMLはあまり必要ではありません
XMLは優れた汎用性の高いマークアップ言語で、あらゆるプログラム言語で処理されてますしどこでも使われています。不運にも、XMLは記述するのには非常に冗長であり、パースが難しく、本音を言うと多くの場面では一見して読むことができるとは言えません。次のようなコードの断片と違って。

---
regexp: !ruby/regexp /a-zA-Z/
number: 4.7
string: a string

これはXMLより絶対に簡単で、より可読性が高いといえるでしょう、そうではありませんか?YAMLにようこそ、Rubyの大好きなマークアップ言語です(本物ではないけれど)。YAMLはRubyのあらゆるオブジェクトをシンプルかつ明確に完璧に表現するのに使うことができます。RubyでXMLをパースすることはできますが、YAMLは簡潔なので、多くの開発者は設定ファイルにXMLの代わりにYAMLを使っています。Railsがその例です。さっきのコードの断片は次のRubyのコードを実行することによって得られたものです。

{"string" => "a string", "number" => 4.7, "regexp" => /a-zA-Z/}.to_yaml

to_yamlメソッドはオブジェクトクラスに定義されています。オブジェクトクラスは他の全てのクラスの父なので、このメソッドは全てのRubyオブジェクトで使うことができます。開発者は完全に透過的にあらゆるものをYAMLにできますし、あらゆるものをRubyのオブジェクトに戻せるのです。
パースはもうたくさんでしょう、ね?

#9 Lambdaはただのギリシャ文字ではありません
RubyはLispとPerlから、Procオブジェクトとブロックである魔法を拝借しています。Procは「ローカル変数と結びついたコードブロック。一度結びついたら、そのコードは異なったコンテキストで呼ばれるし、それらの変数にアクセスできる。」というものです。次をみてください。

def gen_times(factor)
  return Proc.new {|n| n*factor }
end

times3 = gen_times(3)
times5 = gen_times(5)
times3.call(12)                  #=> 36
times5.call(5)                    #=> 25
times3.call(times5.call(4))   #=> 60

Proc.newの代わりにlambdaキーワードも使えます。これはPerlとPythonもしくはLispを知っている人の注意を引くでしょう。PHPでも同じことはできますが、ほとんどの人はその関数を本気で使用しません。

加えて、urborn Procsの類のように、Rubyはブロックを広汎に使用しています。Arrayクラスで使えるeachメソッドのように、あるオブジェクトの内容を繰り返したりあるコードを実行するのがその例です。

[1, 2, 4, 6, 8].each {|c| puts c*2} #=> 各要素を2倍したものを新しい行に出力している

ブロック内のコードが1行を超えるなら、(必要というわけではありませんが)ブレスを使う代わりにブロックをdo … endにまとめましょう。Rubyでは実のところあまりブレスは好まれません。

#10 - Railsでできるんです
大事なものを忘れてました、Webアプリケーションを開発するのにRuby on Railsを常に使うことができるのです。PHPでの開発に比べて簡単ではないかもしれませんが、RailsはRubyで構成されています。なぜなら Rubyは他の言語にはない特徴を持っているからです。

Trackback URL



コメント

Reader Comments

Be the first to leave a comment!