Ruby
出典: フリー百科事典『ウィキペディア(Wikipedia)』
パラダイム: | オブジェクト指向プログラミング |
---|---|
登場時期: | 1995年 |
設計者: | まつもとゆきひろ |
最新リリース: | 1.8.6 / 2007年3月13日 |
型付け: | 強い動的型付け、ダック・タイピング |
主な処理系: | Ruby、JRuby |
影響を受けた言語: | Smalltalk、Lisp、Perl、Python |
影響を与えた言語: | Groovy |
ライセンス: | RubyライセンスまたはGPL |
ウェブサイト: | www.ruby-lang.org |
Ruby(ルビー)は、まつもとゆきひろ(通称Matz)により開発されたオブジェクト指向スクリプト言語であり、従来Perlなどのスクリプト言語が用いられてきた領域でのオブジェクト指向プログラミングを実現する。Rubyは当初1993年2月24日に生まれ、1995年12月にfj上で発表された。名称のRubyは、プログラミング言語Perlが6月の誕生石であるPearl(真珠)とほぼ同じ発音をすることから、まつもと氏の同僚の誕生石(7月)のルビーを取って名付けられた。
Rubyはクラス定義、ガベージコレクション、強力な正規表現処理、マルチスレッド、例外処理、イテレータ・クロージャ、Mixin、演算子オーバーロードなどの機能を持つ。Perlの代替となることができることが初期の段階から重視されている。Perlと同様にグルー言語としての使い方が可能で、Cプログラムやライブラリを呼び出す拡張モジュールを組み込むことができる。
Ruby処理系はインタプリタとして実装されている(実験的にはJIT方式による実行時コンパイルも試みられている)。
Rubyの構文は、ALGOL系を継承しながら、可読性を重視している。Rubyにおいては整数や文字列なども含めデータ型はすべてがオブジェクトであり、純粋なオブジェクト指向言語といえる。
Rubyはフリーソフトウェアとして(GPLあるいはArtisticに似た独自ライセンス)で配布されている。
目次 |
[編集] Ruby哲学
Rubyの作者 まつもとゆきひろ は、Rubyの言語仕様策定においてもっとも重視しているのはストレスなくプログラミングを楽しむこと (Enjoy programming) であると述べている。Perlのモットー「やり方はいろいろある (TMTOWTDI; There's More Than One Way To Do It)」は「多様性は善(Diversity is Good)」というスローガンでRubyに引き継がれてはいるものの、最重要なものではないとも述べており、非推奨な手法も可能とすると同時に、そのような手法を言語仕様的に使いにくくする事によって、自粛を促しているため洗脳言語(Babel-17)という側面がある。
[編集] 実装
Rubyには主として2つの実装がある。1つは公式のRubyインタプリタで、最も広く使われている。もう1つはJavaベースの実装でJRubyという名称である。Rubyインタプリタは多くのプラットフォームに移植されている。具体的にはUNIX、Linux、Microsoft Windows、MS-DOS、Mac OS X、OS/2、Amigaなどである。JRubyも実装が純粋なJavaで行われているために、プラットフォーム非依存の利用が可能で、かつほとんどのRubyクラスが組み込みで提供されている。
[編集] 競合言語としてのPython
プログラミング言語としてのRubyは大雑把に言うと「Perlのオブジェクト指向版」、つまりインタプリタで実行する高機能なスクリプト言語でありオブジェクト指向機能を持つもの、と位置づけることができるが、この位置付けはスクリプト言語Pythonと同じである。このことがそれぞれの言語のユーザ同士の間で「どちらの言語が優れているか」といった論争を生んできた。しかしその論争は技術的な細部にとらわれた不毛なフレームになることも多かった。
ここであえて両者の細部を比較はしないが、ユーザ数や書かれたシステムの数量・質などを現時点で比べると世界的にはPythonの方が人気が高い。一方、日本では開発者が日本人であることもあり、Rubyの人気は高く書籍も多く出版されている。とはいえ2004年前後まで圧倒的なキラーアプリがなく、tDiaryやバグトラッキングシステム「影舞」程度しか知られていなかったため、大きな普及には至らなかった。ところが2004年末に発表され2005年に大ブレイクしたRuby on Railsにより一気に注目を集めている。
[編集] 例
基本的なコード:
# 文字リテラルを含め全てがオブジェクトである: -199.abs # 199 "ruby is cool".length # 12 "Rick".index("c") # 2 "Nice Day Isn't It?".split(//).uniq.sort.join # " '?DINaceinsty"
[編集] コレクション
配列の作成と使用法:
a = [1, 'hi', 3.14, 1, 2, [4, 5]] a[2] # 3.14 a.reverse # [[4, 5], 2, 1, 3.14, 'hi', 1] a.flatten.uniq # [1, 'hi', 3.14, 2, 4, 5]
ハッシュの作成と使用法:
hash = {'water' => 'wet', 'fire' => 'hot'} puts hash['fire'] # Prints: hot hash.each_pair do |key, value| puts "#{key} is #{value}" end # 表示: water is wet # fire is hot hash.delete_if {|key, value| key == 'water'} # Deletes 'water' => 'wet'
[編集] ブロックとイテレータ
ブロックの生成には二つの方法がある:
{ puts "Hello, World!" }
do puts "Hello, World!" end
ブロックを引数として扱う(クロージャと見なせる):
def remember(&p) @block = p end # ブロックを引数としてメソッドを起動するとnameに値を取って帰ってくる。 remember {|name| puts "Hello, " + name + "!"} # 間をおいてクロージャを呼び出す! @block.call("John") # 表示:"Hello, John!"
次のコードはPythonのクロージャの項目をデモしたものである。
def foo(initial_value = 0) var = initial_value return Proc.new {|x| var = x}, Proc.new { var } end setter, getter = foo setter.call(21) getter.call # => 21
ブロックへ値を生成(yield
)する場合その呼び出し位置で与えられる。
def bfs(e) q = e while not q.empty? u = q.shift yield u u.each{|v| q.push v} if u.class == Array end end bfs([0,1,[2,3],4,[5,[6,7,8]],9]) {|v| p v}
ブロックを使用しての列挙や配列のイテレーション
a = [1, 'hi', 3.14] a.each {|item| puts item} # 各要素を表示 (3..6).each {|num| puts num} # 3番目から6番目まで表示
ブロックは多数の組み込みメソッドがある:
File.open('file.txt', 'w+b') do |file| file.puts 'Wrote some text.' end # Fileはここで自動的にcloseされる
または
IO.readlines('file.txt') do |line| # ここで何らかの処理 end
列挙とブロックを使って2乗を求める:
(1..10).collect {|x| x*x} => [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
[編集] クラス
次のコードはPerson
という名前のクラスである。その中、まずinitialize
はオブジェクトを初期化するコンストラクタである。ほかに2つのメソッドがあり、1つは比較演算子である<=>
をオーバーライドしておりArray#sort
によりプロパティage
でソートすることができる。もう1つのオーバーライド箇所のto_s
メソッドは Kernel#puts
での表示の形式を整える。attr_reader
はRubyにおけるメタプログラミングの例であり、attr
はインスタンス変数の入出力を司るgetterやsetterメソッド(アクセサ)を定義する。attr_reader
はgetterメソッドのみの定義である。なおメソッド中では最後に評価された式が返り値となり、明示的なreturn
は省略できる。
class Person def initialize(name, age) @name, @age = name, age end def <=>(person) @age <=> person.age end def to_s "#{@name} (#{@age})" end attr_reader :name, :age end group = [ Person.new("John", 20), Person.new("Markus", 63), Person.new("Ash", 16) ] puts group.sort.reverse
結果は3つの名前が年の大きい順に表示される:
Markus (63) John (20) Ash (16)
[編集] 例外
例外はなにか不具合が起こったときraise
の呼び出しで発生させることができる:
例外にはメッセージを追加することもできる:
raise "This is a message"
さらに例外のタイプも指定できる:
raise ArgumentError, "Illegal arguments!"
例外はrescue
節で処理することができ、次のようにコードにrescue
を付加するだけである:
begin # 通常処理 rescue # 例外処理 end
[編集] Rubyの周辺技術
- 分散オブジェクトを実現するdRuby
- Apache HTTP Serverに組み込むためのmod_ruby
- HTMLへの埋め込みRuby文を実現するeRuby
- Rubyスクリプトに埋め込むことができる文書形式RD
- RubyによるRDを採用したWikiクローン、RWiki
- RubyからSDLライブラリを扱えるようにするRuby/SDL
- RubyからDelphiを扱えるようにするApollo
- RubyによるWebアプリケーションフレームワークRuby on Rails
- Rubyの別の処理系であるYARV(Yet another RubyVM)
- Rubyの統合開発環境RDE(Ruby Development Environment)
- RubyのコードをWindowsの実行形式ファイルに変換するExerb
- Ruby用のライブラリ管理システムであるRubyGems
[編集] Rubyを使ったアプリケーション
- tDiary
- 影舞
- Hiki
- Ruby on Rails
- qwikWeb
[編集] 参考文献
- 『プログラミングRuby—達人プログラマーガイド』デビット トーマス、アンドリュー ハント、まつもと ゆきひろ - ISBN 4894714531
- 『たのしいRuby Rubyではじめる気軽なプログラミング』高橋征義、後藤裕蔵、まつもとゆきひろ(ソフトバンクパブリッシング):プログラム未経験者向けの入門書 - ISBN 4797314087
- 『オブジェクト指向スクリプト言語 Ruby』まつもとゆきひろ、石塚圭樹 - ISBN 4756132545
[編集] 外部リンク
- オブジェクト指向言語Rubyホームページ
- スラッシュドット・ジャパンでの まつもとゆきひろ へのインタビュー
- Open Directory - Ruby カテゴリ
- Ruby Application Archive
- RubyForge
カテゴリ: オブジェクト指向言語 | オープンソース | スクリプト言語 | Ruby