|
Article on other languages:
|
Ruby(ルビー)は、まつもとゆきひろ(通称Matz)により開発されたオブジェクト指向スクリプト言語であり、従来Perlなどのスクリプト言語が用いられてきた領域でのオブジェクト指向プログラミングを実現する。Rubyは当初1993年2月24日に生まれ、1995年12月にfj上で発表された。名称のRubyは、プログラミング言語Perlが6月の誕生石であるPearl(真珠)とほぼ同じ発音をすることから、まつもとの同僚の誕生石(7月)のルビーを取って名付けられた。 機能として、クラス定義、ガベージコレクション、強力な正規表現処理、マルチスレッド、例外処理、イテレータ・クロージャ、Mixin、演算子オーバーロードなどがある。Perlの代替となることができることが初期の段階から重視されている。Perlと同様にグルー言語としての使い方が可能で、Cプログラムやライブラリを呼び出す拡張モジュールを組み込むことができる。 Ruby処理系はインタプリタとして実装されている(実験的にJIT方式による実行時コンパイルも試みられている)。 構文は、ALGOL系を継承しながら、可読性を重視している。Rubyにおいては整数や文字列なども含めデータ型はすべてがオブジェクトであり、純粋なオブジェクト指向言語といえる。 フリーソフトウェアとしてruby ライセンス(Ruby License や Ruby's と表記されることもある。GPLかArtisticに似た独自ライセンスを選択するデュアルライセンス)で配布されている。
Ruby哲学開発者のまつもとゆきひろは、「Rubyの言語仕様策定において最も重視しているのはストレスなくプログラミングを楽しむこと (Enjoy programming) である」と述べている(ただし、明文化された公式な言語仕様は2008年5月現在存在しない)。Perlのモットー「やり方はいろいろある (TMTOWTDI; There's More Than One Way To Do It)」は「多様性は善(Diversity is Good)」というスローガンでRubyに引き継がれてはいるものの、最重要なものではないとも述べており、非推奨な手法も可能とすると同時に、そのような手法を言語仕様的に使いにくくする事によって、自粛を促しているため洗脳言語(Babel-17)という側面がある。 実装Rubyには主として2つの実装がある。
その他の実装として、Rubiniusや、.NET Framework上で動くIronRubyがある。 公式のインタプリタまつもとゆきひろによって開発されはじめたC言語による実装であり、最も広く使われている。他の実装と区別するため、CRuby、ないしはMRI(Matz' Ruby Implementation)と呼ばれることもある。 UNIX、Linux、Microsoft Windows、MS-DOS、Mac OS X、OS/2、Amigaなど多くのプラットフォームに移植されている。 JRuby詳細はJRubyを参照 Javaベースの実装。純粋な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'] # 表示: 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' 制御構造ほかの言語でもよくみられるような制御構造を用いることができる if "fablic".length > 3 puts 'ya' else puts 'nop' end # 表示: ya n = 0 while n < 3 puts 'foobar' n += 1 end # 表示: foobar # foobar # foobar 一部の制御構造は後述するイテレータで代替することができる。 ブロックとイテレータrubyではブロック付きメソッド呼び出し(イテレータとも呼ばれる)を 用いるコードが好まれることが多い。これを用いると、ユーザー定義の制御構造やコールバック など様々な処理を簡潔に記述できる利点があるからである。 ブロックの表記方法には二つの方法がある。メソッドの末尾に記述することで機能する { puts "Hello, World!" } do puts "Hello, World!" end ブロック付きメソッド呼び出しが繰り返し処理を主な役割としていたことから、イテレータと呼ばれていた時期がある。しかし、実際には繰り返し処理にとどまらず、様々な使われ方をしているので、最近はブロック付きメソッド呼び出し全体の総称としてイテレータという名称を用いるのは適切でないと考えられている。[1] 繰り返し処理配列の各要素への繰り返し処理 list = [1, 2, 5, 13, 21] list.collect!{|item| item*2} # listの各要素を2倍する list = [1, 2, 5, 13, 21] # ブロックを使用しない場合 n = 0 while n < list.length list[n] *= 2 n += 1 end 指定した回数の繰り返し処理 3.times{ puts 'foobar' } #制御構造の項のwhileの例と同じ 後処理の省力化ブロックの内容を実行してから、決められた後処理を行うメソッドもある File.open('file.txt', 'w+b') do |file| file.puts 'Wrote some text.' end # Fileはここで自動的にcloseされる これは次の例と同様の処理を行う(ensureについては例外処理の項を参照) begin file = File.open('file.txt', 'w+b') file.puts 'Wrote some text.' ensure file.close end 本処理を後から指定実際に行いたい処理をブロックで記述する。 前項の後処理の省力化もこれの一例といえる。 def bfs(list) #配列をツリーに見立てた処理 while not list.empty? unit = list.shift yield unit #ブロックの内容を実行 unit.each{|v| list.push v} if defined? unit.push end end bfs([0,1,[2,3],4,[5,[6,7,8]],9]) {|v| p v} この例は"ツリーから要素と分枝をつぎつぎと取り出し"て"取り出したものになんらかの処理を行う" ものである。メソッドの利用者は、"なんらかの処理"のみを記述すればよく、取り出しのアルゴリズムなど、本質的でない内容に意識を向ける必要がなくなる。 クロージャクロージャとなるようなブロックの引数渡し # オブジェクトのインスタンス変数(変数名の頭に@が付く)でブロックを記憶。 def remember(&p) @block = p end # nameを受け取るブロックを引数に、上記のメソッドを呼び出す。 remember {|name| puts "Hello, " + name + "!"} # 後に必要になった時点でクロージャを呼び出す。 @block.call("John") # 表示:"Hello, John!" メソッドからクロージャを返す例 def create_set_and_get(value = 0) return proc {|x| value = x}, proc { value } end setter, getter = create_set_and_get setter.call(21) getter.call # => 21 クラス次のコードは 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 "This is a message" さらに例外のタイプも指定できる raise ArgumentError, "Illegal arguments!" 例外は begin # 通常処理 rescue # 例外処理 ensure # 例外の発生に関わらず必ず実行される処理 end Rubyの周辺技術
Rubyで開発されたアプリケーションRubyを組み込んだアプリケーション
エピソードRubyではブロック構造を 参考文献
脚注外部リンク |
|||||||||||||||||||||||||||||||||||||||||
This article is from Wikipedia. All text is available under the terms of the GNU Free Documentation License.
Mercedes Car
This site monitored by SitePinger.net