Ruby
Ruby(ルビー)は、まつもとゆきひろ(通称: Matz)により開発された、簡潔な文法が特徴的なオブジェクト指向スクリプト言語[注釈 1][4]。 日本で開発されたプログラミング言語としては初めて国際電気標準会議(IEC)で国際規格に認証された事例となった[5][6]。 概要Ruby は1993年2月24日に生まれ、1995年12月にfj上で発表された。名称の Ruby は、プログラミング言語 Perl が6月の誕生石である Pearl(真珠)と同じ発音をし、「Perlに続く」という意味で、6月の次の誕生石(7月)のルビーから名付けられた[7]。競合言語として Perl の他に Python があり、「Matz(まつもと) が Python に満足していれば Ruby は生まれなかったであろう」と公式のリファレンスの用語集で言及されている[7]。 機能として、クラス定義、ガベージコレクション、強力な正規表現処理、マルチスレッド、例外処理、イテレータ、クロージャ、Mixin、利用者定義演算子などがある。Perl を代替可能であることが初期の段階から重視されている。Perlと同様にグルー言語としての使い方が可能で、C言語プログラムやライブラリを呼び出す拡張モジュールを組み込むことができる。 Ruby 処理系は、インタプリタとコンパイラが存在する(詳しくは#実装を参照)。 可読性を重視した構文となっている。Ruby においては整数や文字列なども含めデータ型はすべてがオブジェクトであり、純粋なオブジェクト指向言語といえる。 長らく言語仕様が明文化されず、まつもとによる実装が言語仕様に準ずるものとして扱われて来たが、2010年6月現在、JRuby や Rubinius といった互換実装の作者を中心に機械実行可能な形で明文化する RubySpec という試みが行われている。公的規格としては2011年3月22日にJIS規格(JIS X 3017)が制定され、その後2012年4月1日に日本発のプログラム言語では初めてISO/IEC規格(ISO/IEC 30170)として承認された [5]。 フリーソフトウェアとしてバージョン1.9.2までは Rubyライセンス(Ruby License や Ruby'sと表記されることもある。GPLかArtisticに似た独自ライセンスを選択するデュアルライセンス)で配布されていたが、バージョン1.9.3以降は2-clause BSDLとのデュアルライセンスで配布されている[8]。 ゆかりのある地域Rubyは日本の国産言語として知られており、特にRubyとゆかりのある地域はRubyの聖地と呼ばれている。
設計思想開発者のまつもとゆきひろは、「Rubyの言語仕様策定において最も重視しているのはストレスなくプログラミングを楽しむことである (enjoy programming)」と述べている。
ただし、まつもとによる明文化された言語仕様は存在しない。Perlのモットー「やり方はいろいろある (There's More Than One Way To Do It; TMTOWTDI)」は「多様性は善 (Diversity is Good)」というスローガンで Ruby に引き継がれてはいるものの最重要なものではないとも述べており、非推奨な手法も可能にするとともに、そのような手法を言語仕様により使いにくくすることによって自粛を促している。 また、まつもとは『まつもとゆきひろ コードの世界 スーパー・プログラマになる14の思考法』でもRubyの開発理由を次のように述べている。
また、英語圏の開発者の間ではMINASWAN (Matz is nice and so we are nice. 和訳: まつもとがナイスだから我々もナイスであろう) の標語が用いられている。 「Python、PHP、Perlでは静的型を導入しているため、Rubyも型を導入するべきでは」と長年言われているが、まつもとは「Rubyに型を取り入れたくない。DRY (Don't repeat yourself)ではないから」「型宣言することはコンピュータに使われているような気になる」と否定的であり、2019年5月現在Rubyに静的型が導入される予定はない[11]。 クラス名はアルファベットの大文字から始めるという制約があり、日本語などの非ASCII文字のみでクラス名を定義する方法がない。この件についてまつもとは以下のように語っており、英語を共通言語として使うべきであるという立場を表明している。
実装公式な実装Rubyの公式な実装には、以下の二種類が存在する。
その他の実装
例基本的なコード # 文字列、数値を含め、全てがオブジェクトである
-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'}
hash = {water: 'wet', fire: 'hot'} # シンボルリテラルをキーとする場合、Ruby 1.9 からはこのような Javascript 風の表記ができる。
puts hash[:fire] # 表示: hot
hash.each 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
list = [1, 2, 5, 13, 21]
for item in list
puts item
end
# 表示: 1
# 2
# 5
# 13
# 21
n = 0
while n < 3
puts 'foobar'
n += 1
end
# 表示: foobar
# foobar
# foobar
上記、 if "fablic".length > 3
puts 'ya'
else
puts 'nop'
end
は、 puts "fablic".length > 3 ? "ya" : "nop"
puts(
if "fablic".length > 3
"ya"
else
"nop"
end
)
puts(
case "fablic".length
when .. 3
"nop"
else
"ya"
end
)
のような記述もできる。 一部の制御構造は後述するイテレータで代替することができる。 ブロック付きメソッド呼び出しRuby ではブロック付きメソッド呼び出しを用いるコードが好まれることが多い。これを用いると、ユーザー定義の制御構造やコールバックなど様々な処理を簡潔に記述できるからである。 ブロックとは波括弧 # { ... }
method1 { puts "Hello, World!" }
# do ... end
method2 do
puts "Hello, world!"
end
ブロック付きメソッド呼び出しが繰り返し処理を主な役割としていたことから、イテレータと呼ばれていた時期がある。しかし、実際には繰り返し処理にとどまらず、様々な使われ方をしているので、最近はブロック付きメソッド呼び出し全体の総称としてイテレータという名称を用いるのは適切でないと考えられている[13]。 繰り返し処理配列の各要素への繰り返し処理 list = [1, 2, 5, 13, 21]
list.map! {|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の例と同じ
puts "ABC-ABC".gsub("B", "1B2") # OK "A1B2C-A1B2C"
puts "ABC-ABC".gsub(/(B)/, "1#{$1}2") # NG "A12C-A12C"
puts "ABC-ABC".gsub(/(B)/){"1#{$1}2"} # OK "A1B2C-A1B2C"
後処理の省力化ブロックの内容を実行してから、決められた後処理を行うメソッドもある。 File.open('file.txt', 'w+b') do |file|
file.puts 'Wrote some text.'
end # file.txtはここで自動的に閉じられる
これは次の例と同様の処理を行う( begin
file = File.open('file.txt', 'w+b')
file.puts 'Wrote some text.'
ensure
file.close
end
本処理を後から指定実際に行いたい処理をブロックで記述する。前項の後処理の省力化もこれの一例といえる。 def bfs(list) #配列をツリーに見立てた処理
until 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
# 例外処理。引数を省略すると、StandardErrorのサブクラスの例外のみ処理する
rescue SomeError
# 例外処理。SomeErrorの例外のみ処理する。
ensure
# 例外の発生に関わらず必ず実行される処理
else
# 例外が発生しなかったときに実行される処理
end
不向きな処理ベンチマークテストで使用される以下のようなコードを実行したとき、処理速度が著しく低下することがある。 i1 = 1000000
while i1 <= 1010000
i2 = i1 - 1
i3 = 2
while i3 <= i1
if (i1 % i3) == 0
break
elsif i3 == i2
puts i1.to_s
break
end
i3 += 1
end
i1 += 1
end
Rubyの周辺技術
Rubyで開発されたアプリケーション
Rubyを組み込んだアプリケーション
エピソードRuby ではブロック構造を 「Rubyは死んだ」「Rubyはよく『死んだ』って言われる言語である」とまつもとは認識しておりTwitterがRuby on RailsからJava仮想マシン用言語のScalaに移行した話などを例に出し「Rubyは死んだ」みたいに言われることが増えたとしているほか、オランダのTIOBEという会社が発表しているプログラミング言語の人気ランキングでRubyが上位に入らないことをもってして「Rubyは死んだ」「Rubyは凋落している」と見られることがあるが、「RubyとかRuby on Railsだと、さまざまなジャンルで実際の適用例があるので、なにか困ったとき同じ問題に直面した人を探せたり、あるいはその問題を解決するRubyGemsを見つけられる。そういう点でいうと、トータルの生産性はかなり高いことがある」「実際に仕事として、あるいは自分のプロダクトを作るときに、どんな言語を選択してどういうふうに開発したらいいのかを考えると、Rubyの持っているビジネス上の価値はそんなに下がっていないと思います。たとえ順位が下がって、表面上Rubyの人気が凋落したように見えても、ある意味『まだまだ大丈夫』が1つの見識だと思います」とまつもとは述べている[16]。 Ruby on RailsがPythonで作られなかった理由デイヴィッド・ハイネマイヤー・ハンソンがRuby on Railsを構築するのにPythonを選ばなかった理由として「私の場合は、恋に落ちたのがRubyなのです。私はRubyに恋をしていますし、もう14年間もそうなのです。(中略)『最適なツール』などというものは存在しないのです。あなたの脳をちょうどいい具合に刺激するパズルがあるだけなのです。今日では、ほぼなんでも作ることができます。そして、それを使って、さらに何でも作れてしまうのです。これは素晴らしいことです。表現や言語、そして思考の多様性に乾杯しましょう!」と質問サイトのQuoraで本人が回答している[17]。 まつもとゆきひろが書いたコードの割合2020年9月8日現在、RubyのCコード509,802行のうち、まつもとがコミットしたのは36,437行で1割以下になっている[18]。 脚注注釈出典
参考文献
関連項目外部リンク
|