Ruby
- Aragonés
- العربية
- Asturianu
- Azərbaycanca
- تۆرکجه
- Žemaitėška
- Беларуская
- Български
- বাংলা
- Bosanski
- Català
- کوردی
- Čeština
- Dansk
- Deutsch
- Ελληνικά
- English
- Esperanto
- Español
- Eesti
- Euskara
- فارسی
- Suomi
- Français
- Galego
- Hausa
- עברית
- Hrvatski
- Magyar
- Հայերեն
- Interlingua
- Bahasa Indonesia
- Ido
- Italiano
- ქართული
- 한국어
- Кыргызча
- Lombard
- Lietuvių
- Latviešu
- മലയാളം
- मराठी
- Bahasa Melayu
- မြန်မာဘာသာ
- Nederlands
- Norsk nynorsk
- Norsk bokmål
- ଓଡ଼ିଆ
- ਪੰਜਾਬੀ
- Polski
- پنجابی
- Português
- Română
- Русский
- Srpskohrvatski / српскохрватски
- Simple English
- Slovenčina
- Shqip
- Српски / srpski
- Svenska
- Kiswahili
- தமிழ்
- తెలుగు
- Тоҷикӣ
- ไทย
- Türkçe
- Татарча / tatarça
- Українська
- اردو
- Oʻzbekcha / ўзбекча
- Tiếng Việt
- 吴语
- 中文
- 粵語
| パラダイム | 関数型プログラミング、命令型プログラミング、オブジェクト指向プログラミング、リフレクション ウィキデータを編集 |
|---|---|
| 登場時期 | 1995年 (30年前) (1995) |
| 開発者 | まつもとゆきひろ ウィキデータを編集 |
| 最新リリース | 3.4.7[1] ウィキデータを編集 / 2025年10月7日 (58日前) |
| 型付け | 強い動的型付け, ダック・タイピング |
| 主な処理系 | MRI, YARV, JRuby, IronRuby, MacRuby |
| 影響を受けた言語 | Ada、Dylan、Perl、Python、Smalltalk、C++、CLU、Eiffel、LISP、BASIC、Lua、Emacs ウィキデータを編集 |
| 影響を与えた言語 | D言語 [2] 、Groovy、Swift、Crystal、Scala、Elixir |
| プラットフォーム | Microsoft Windows、Linux、*BSD、macOS ウィキデータを編集 |
| ライセンス | Rubyライセンス、GPL 2.0、2条項BSDライセンス ウィキデータを編集 |
| ウェブサイト |
www |
| 拡張子 | rb、rbw ウィキデータを編集 |
| テンプレートを表示 | |
Ruby(ルビー)は、まつもとゆきひろ(通称: Matz)により開発された、簡潔な文法が特徴的なオブジェクト指向 スクリプト言語 [3] 。
日本で開発されたプログラミング言語としては初めて国際電気標準会議(IEC)で国際規格に認証された事例となった[4] [5] 。
概要
[編集 ]Rubyは、1993年 2月24日に生まれ、1995年12月にfj上で発表された。6月の誕生石Pearl(真珠)と同じ発音をするプログラミング言語 Perlに続くという意味で、7月の誕生石Ruby(ルビー)から名付けられた[6] 。
文字列・数値等すべてのデータをオブジェクトとして扱うオブジェクト指向プログラミング言語である。
クラス、ガベージコレクション、例外処理、Mixin、正規表現等の基本機能に、別途機能をRubyGemsで追加することが可能である。
2011年3月22日に、JIS規格「JIS X 3017」が制定され、その後2012年4月1日に、日本発のプログラミング言語では初めて、ISO/IEC規格「ISO/IEC 30170」に承認された。
2025年9月現在、言語仕様は明文化されていない[注釈 1] 。
バージョン1.9.3以降、BSDとのデュアルライセンスで頒布されている。
設計思想
[編集 ]Rubyの言語仕様策定において、最も重視しているのは、ストレスなくプログラミングを楽しむことである/enjoy programming[7] 。
Ruby には Perl や Python とは決定的に違う点があり、それこそが Ruby の存在価値なのです。それは「楽しさ」です。私の知る限り、Ruby ほど「楽しさ」について焦点を当てている言語は他にありません。Ruby は純粋に楽しみのために設計され、言語を作る人、使う人、学ぶ人すべてが楽しめることを目的としています。しかし、ただ単に楽しいだけではありません。Ruby は実用性も十分です。実用性がなければ楽しめないではありませんか。
なぜRubyを開発したのか[8] 。
「なぜRubyを開発したのか」。そのように問われるときに、もっとも適切な答えは、Linux開発者であるリーナス・トーバルズの言葉と同じではないかと思います。
クラス名はアルファベットの大文字から始めるという制約があり、日本語などの非ASCII文字のみでクラス名を定義する方法がない。この件についてMatzは以下のように語っており、英語を共通言語として使うべきであるという立場を表明している[9] 。
2文字目以降は自由なので、もしどうしても日本語が使いたいのであれば、少々不自然にも見えますが、先頭だけ大文字の接頭辞をつけるのはどうでしょうか。しかし、私個人としては、日本語の変数名などを使うことは、そのプログラムを読む人の範囲を日本語が読める人に限定してしまうことになるので、ひどくもったいないのではないかと感じています。そこで、この点を積極的に改善する気にはなれないのです。
静的型について、Matzは(基本設計思想である動的型付けを維持し)『静的型付けを導入しない』意思を改めて示した[10] 。
その代わり、静的解析を導入し、型チェックを行えるようにすることを明らかにしました。(中略)静的解析に期待してほしい、とまつもとさんは述べました。
静的解析は、Ruby 3.0.0から実装された。
MINASWAN「Matzがniceだから俺らもniceでいよう」[11]
そしてRuby(中略)コミュニティを表現した標語に"MINASWAN"というものがあると紹介しました。これは"Matz is nice so we are nice"の略で、もめごとがあっても「matzがniceだから俺らもniceでいよう」と、なだめることが海外のメーリングリストではよく見られるそうです。(中略)今ではスローガンにまで昇華しています。(中略)日本のRubyコミュニティにこの特質を逆輸入したいと考え、講演の最初に取り上げたと述べました。
実装
[編集 ]公式
[編集 ]MRI
[編集 ]- MRI(Matz Ruby Interpreter)あるいは、CRuby(C言語で書かれていることに由来する)と呼ばれる。Matzが開発を始めた実装であり最も広く使われている。(狭義として)#YARVに更新される以前(1.8.x以前)のバージョンを指すこともある。
YARV
[編集 ]- YARVは、1.9で採用された#MRIのevalをバイトコードで実行するタイプに置き換えたもの。(狭義の)MRIはソースコードを構文木にコンパイルした後、構文木を解釈する仮想マシンであるevalで実行するインタプリタであるが、YARVはソースコードをバイトコードにコンパイルした後、バイトコードを解釈する仮想マシンであるevalで実行するインタプリタである。Javaなどのバイトコードとは違い、このバイトコードはファイルとしては生成されない(ファイルとして静的に外部化することを考慮した設計では基本的になく、シンボルを多用するなどしている)。なお「YARV」は、もともとは開発中におけるその仮想マシンの名前だった。
その他
[編集 ]JRuby
[編集 ]- JRubyは、JavaによるRuby実装である(プラットフォーム非依存の利用が可能)。ほとんどのRubyクラスが組み込みで提供されている。インタプリタ・実行時コンパイラ・事前コンパイラの3種類が用意されている。事前コンパイラでは、Javaバイトコードへ変換しJRubyが無くても他のJavaプラットフォーム上で動作させることが可能となる。
IronRuby
[編集 ]- IronRubyは、.NET FrameworkによるRuby実装であり、.NET Frameworkのライブラリと連携させることができる。JIT方式のバイトコードインタプリタ。共通言語基盤に準拠した実装(Monoなど)で動作するため、プラットフォーム非依存の利用も可能(ただし、ソースコードが.NET Frameworkのライブラリに依存している場合、Monoでの動作は不可能)。
MacRuby
[編集 ]Rubinius
[編集 ]MagLev
[編集 ]- MagLevは、Smalltalk 仮想マシンのRuby実装 。
mruby
[編集 ]仮想マシン
[編集 ]Parrot
[編集 ]- Parrotで動作させるための実装なども開発されている。
コード例
[編集 ]ここでは、実用途に即したコード例を中心に記載します。
クロスプラットフォームでの使用を考慮していますが、Unix系コマンドを利用できない環境では正常に動作しないことがあります。
なお、ウィキブックスには、より多くの基本的なコード例が記載されています。
基本的なコード
[編集 ]文字列・数値等すべてのデータがオブジェクト
p-199.abs#=> 199 p"ruby is cool".length#=> 12 p"Rick".index("c")#=> 2 p"Nice Day Isn't It?".split(//).uniq.sort.join#=> " '?DINaceinsty"
おまじない
[編集 ]ヘッダ情報の付与
#!/usr/bin/env ruby #coding:utf-8 puts"本コードは、これ以降に書く。"
変数と定数
[編集 ]ローカル変数
[編集 ]小文字 または '_' で始まる識別子は ローカル変数
var=123 pvar=456#=> 456
_v=123 p_v=456#=> 456
グローバル変数
[編集 ]'$' で始まる識別子は グローバル変数
$var=123 p$var=456#=> 456
定数
[編集 ]アルファベット大文字 [A-Z]で始まる識別子は 定数
Var=123 pVar=456#=> 警告: 定数 Var はすでに初期化されています
コレクション
[編集 ]コレクションに関する例
配列
[編集 ]配列の作成と使用法
a1=[1,"hi",3.14,1,2,[4,5]] pa1[2]#=> 3.14 pa1[0..2]#=> [1, "hi", 3.14] pa1[0,2]#=> [1, "hi"] pa1.reverse#=> [[4, 5], 2, 1, 3.14, "hi", 1] pa1.reverse.flatten#=> [4, 5, 2, 1, 3.14, "hi", 1] pa1.reverse.flatten.uniq#=> [4, 5, 2, 1, 3.14, "hi"]
# いずれも以下を出力 # ["A", "B C", "D"] # 文字列を配列に変換 S1="A \n B C\nD\n" pS1.split("\n").map{|_v|_v.strip} # ヒアドキュメントを配列に変換 S2=<<EOD A B C D EOD pS2.split("\n").map{|_v|_v.strip} # %w記法で配列に変換 p%w(A B\ C D) p%w( A B\ C D )
# %w記法で都道府県コードの配列を作成する例 # [1..47] = ["北海道".."沖縄県"](一部抜粋) pA1=[nil]+%w(北海道 青森県 岩手県 宮城県)#=> [nil, "北海道", "青森県", "岩手県", "宮城県"] print4,": ",A1[4],"\n"#=> "4: 宮城県"
ハッシュ
[編集 ]ハッシュの作成と使用法
h10={} h10["water"]="wet" h10["fire"]="hot" h20={"water"=>"wet","fire"=>"hot"} h31={:water=>"wet",:fire=>"hot"} h32={:"water"=>"wet",:"fire"=>"hot"} h41={water:"wet",fire:"hot"} h42={"water":"wet","fire":"hot"} # いずれも以下を出力 # "hot" ph10["fire"] ph20["fire"] ph31[:fire] ph32[:"fire"] ph41[:fire] ph42[:"fire"] # いずれも以下を出力 # water: wet # fire: hot h10.each{|_k,_v|print_k,": ",_v,"\n"} h20.each{|_k,_v|print_k,": ",_v,"\n"} h31.each{|_k,_v|print_k,": ",_v,"\n"} h32.each{|_k,_v|print_k,": ",_v,"\n"} h41.each{|_k,_v|print_k,": ",_v,"\n"} h42.each{|_k,_v|print_k,": ",_v,"\n"}
制御構造
[編集 ]ほかの言語でもよくみられるような制御構造を用いることができる。
条件分岐
[編集 ]if, case
[編集 ]# [Ctrl]+[C] Signal.trap(:INT)do puts exit end # キー入力 print"[Y/n] ? " ps1=STDIN.gets.strip.upcase print"例1-1: " ifs1=="Y" putstrue elsifs1=="N" putsfalse else putsnil end print"例1-2: " puts( ifs1=="Y" true elsifs1=="N" false else nil end ) print"例2: " putss1=="Y"?true:nil print"例3: " printtrueifs1=="Y" puts print"例4: " puts( cases1 when"Y" true when"N" false else nil end )
ブロック
[編集 ]ブロックは { ... } または do ... end によって囲まれたコード列である。
一行で収まるときは { ... }、複数行にまたがるときは do ... end が使用される。
# { ... } "Hello, Ruby!".split{|_s1|puts_s1}
# do ... end "Hello, Ruby!".splitdo|_s1| puts_s1 end
gsub() の罠
[編集 ]S1="ABC-ABC" # ok # 期待どおり => "AびC-AびC" pS1.gsub("B","び") # NG # 期待 => "AびBC-AびBC" # 結果 => "AびC-AびC" pS1.gsub(/(B)/,"び#{1ドル}") # ok # 期待どおり => "AびBC-AびBC" pS1.gsub(/(B)/){"び#{1ドル}"}
繰り返し処理
[編集 ]for
[編集 ]a1=[1,2,5,13,21] a2=[] fori1ina1 a2<<i1*2 end pa2#=> [2, 4, 10, 26, 42]
while
[編集 ]a1=[1,2,5,13,21] i1=0 whilei1<a1.length a1[i1]*=2 i1+=1 end pa1#=> [2, 4, 10, 26, 42]
each メソッド
[編集 ]a1=[1,2,5,13,21] a2=[] a1.each{|i1|a2<<i1*2} pa1#=> [1, 2, 5, 13, 21] pa2#=> [2, 4, 10, 26, 42] a1.each.with_index(0){|i1,i2|a1[i2]=i1*2} pa1#=> [2, 4, 10, 26, 42]
map, map! メソッド
[編集 ]a1=[1,2,5,13,21] # map a2=a1.map{|i1|i1*2} pa1#=> [1, 2, 5, 13, 21] pa2#=> [2, 4, 10, 26, 42] # map! a1.map!{|i1|i1*2} pa1#=> [2, 4, 10, 26, 42]
times メソッド
[編集 ]a1=[1,2,5,13,21] a1.length.times{|i1|a1[i1]*=2} pa1#=> [2, 4, 10, 26, 42]
指定した回数の繰り返し処理
[編集 ]# 以下、いずれも "foofoofoo" を出力。 s1="foo" 3.times{prints1} puts print(s1*3),"\n"
連続する数字の繰り返し処理
[編集 ]# 連続する数字の配列を作成 p(1..5).to_a#=> [1, 2, 3, 4, 5]
# 断続する数字をキーにした空のハッシュを作成 hi1={} [0..5,10,20..21,30].eachdo|e1| ife1.class==Range e1.eachdo|i1| hi1[i1]="" end else hi1[e1]="" end end phi1#=> {0=>"", 1=>"", 2=>"", 3=>"", 4=>"", 5=>"", 10=>"", 20=>"", 21=>"", 30=>""} phi1[0]#=> "" phi1[99]#=> nil
# 上記コードをワンオフ向けに特化した例 hi1={} [(0..5).to_a,10,(20..21).to_a,30].flatten.eachdo|i1| hi1[i1]="" end phi1#=> {0=>"", 1=>"", 2=>"", 3=>"", 4=>"", 5=>"", 10=>"", 20=>"", 21=>"", 30=>""}
ファイルの読み書き
[編集 ]テキストファイル
[編集 ]a1=[] a2=[] # (例1-1) メモリに余裕があるなら、全行読み込んで、配列にした方が扱いやすい。 aText=File.read(__FILE__).split("\n").map{|_s1|_s1.chomp} aText.eachdo|_s1| a1<<_s1if_s1.match("全行") end # (例1-2) メモリに余裕がないときは、1行ずつ読み込んで処理。 File.open(__FILE__,"r")do|_fs| _fs.each_linedo|_s1| _s1.chomp! a2<<_s1if_s1.match("1行ずつ") end end s1=a1.join("\n")+"\n" s2=a2.join("\n")+"\n" # (例2-1) output.txt に書き込む File.write("output.txt",s1) # (例2-2) output.txt に追記する File.open("output.txt","a")do|_fs| _fs.writes2 end puts%x(cat output.txt) =begin Windows: puts %x(type output.txt) 後述「外部コマンド等の利用」に %x() の説明あり =end
バイナリファイル
[編集 ]テキストファイルと異なるメソッド等
File.read(...=>File.binread(... File.open(...,"r")=>File.open(...,"rb") File.open(...,"w")=>File.open(...,"wb") File.open(...,"a")=>File.open(...,"ab") その他、マルチバイト文字を扱うときは、エンコーディングが必要になる。
URL
[編集 ]http経由でテキストデータを読み込む例(#例外処理、#gsub() の罠も参照のこと)
require'open-uri' # URL Url="https://ja.wikipedia.org/w/index.php?title=Ruby&action=history&offset=&limit=5" # 検索文字列 Search="「Ruby」の変更履歴" begin # 全行をメモリに先読みした後、1行ずつ処理する。 URI.open(Url).read.each_line.with_index(1)do|_s1,_i1| _s1.strip! # 文字列検索 if_s1.match(Search) print( # 行番号 "033円[94mL#{_i1}033円[0m\t", # 一致した文字列を色付け表示 _s1.gsub(Search,"033円[95m#{Search}033円[0m"), "\n" ) end end rescue=>e pe end
クロージャ
[編集 ]クロージャとなるようなブロックの引数渡し
# オブジェクトのインスタンス変数(変数名の頭に@が付く)でブロックを記憶。 defremember(&p) @block=p end # nameを受け取るブロックを引数に、上記のメソッドを呼び出す。 remember{|name|puts"Hello, #{name}!"} # 後に必要になった時点でクロージャを呼び出す。 @block.call("Ruby")#=> "Hello, Ruby!"
メソッドからクロージャを返す例
defcreate_set_and_get(value=0) returnproc{|x|value=x},proc{value} end setter,getter=create_set_and_get psetter.call(21)#=> 21 pgetter.call#=> 21
正規表現
[編集 ]正規表現による検索例
# 検索対象文字列 pS1="12345 ABCdef あいうえおかきくけこ" # 検索文字列(正規表現) pRgx1= /(\d{3}).*?([A-z]+).*?(あ.+お)/ # 検索実行 ifS1=~Rgx1 # $& で結果取得 print"全体: ",$&,"\n"#=> "12345 ABCdef あいうえお" # $~[1..] で部分一致の配列取得 print"部分: ",$~[1..],"\n"#=> ["123", "ABCdef", "あいうえお"] end
クラス
[編集 ]次のコードはPersonという名前のクラスである。その中、まずinitializeはオブジェクトを初期化するコンストラクタである。ほかに2つのメソッドがあり、1つは比較演算子である<=>をオーバーライドしておりArray#sortによりプロパティageでソートすることができる。もう1つのオーバーライド箇所のto_sメソッドは Kernel#puts での表示の形式を整える。attr_readerは Ruby におけるメタプログラミングの例であり、attr はインスタンス変数の入出力を司る、いわゆる値を取得する getter メソッドや値を設定する setter メソッド(アクセサ)を定義する。attr_readerは getter メソッドのみの定義である。なおメソッド中では最後に評価された式が返り値となり、明示的なreturnは省略できる。
classPerson definitialize(name,age) @name,@age=name,age end def<=>(person) @age<=>person.age end defto_s "#{@name} (#{@age})" end attr_reader:name,:age end group=[Person.new("John",20), Person.new("Markus",63), Person.new("Ash",16) ] putsgroup.sort.reverse
結果は3つの名前が年の大きい順に表示される。
Markus (63) John (20) Ash (16)
例外処理
[編集 ]想定外のエラーが発生したとき、エラーを分別して実行を継続します。
begin # 処理 rescueerror_type=>e # error_type の例外あり pe rescue=>e # 例外あり pe else # 例外なしのとき実行 ensure # 必ず実行 end
例外なし
# 下記を出力 # Hello Ruby! # else # ensure begin puts"Hello Ruby!" rescue=>e puts"rescue",e else puts"else" ensure puts"ensure" end
例外は raise ... でも発火できる。
例外あり raise "エラー"
# 下記を出力 # rescue # エラー # ensure begin raise"エラー" rescue=>e puts"rescue",e else puts"else" ensure puts"ensure" end
例外あり raise ArgumentError, "Argument エラー"
# 下記を出力 # ArgumentError rescue # Argument エラー # ensure begin raiseArgumentError,"Argument エラー" rescueArgumentError=>e puts"ArgumentError rescue",e rescue=>e puts"rescue",e else puts"else" ensure puts"ensure" end
不向きな処理
[編集 ]ベンチマークテストで使用される以下のようなコードを実行したとき、処理速度が著しく低下することがある。
i1=1000000 whilei1<=1010000 i2=i1-1 i3=2 whilei3<=i1 if(i1%i3)==0 break elsifi3==i2 putsi1.to_s break end i3+=1 end i1+=1 end
外部コマンド等の利用
[編集 ]Ruby on Railsが有名になったため、Rubyを書いたことがない人は「Rubyは敷居が高い」と敬遠するかもしれないが、それは誤解である。Rubyは「小さなことを少しの努力/Doing small things with little effort」で実装できる言語の一つであり、ちょっとしたプロトタイピング開発やシェルスクリプトの代替に向いている。
「少ない労力でより多くの成果を/Do more with less」
以下、外部コマンド等(コマンド、実行ファイル、スクリプト言語)のうち、Unix系コマンドを利用したコード例を記す。
(例1) 実行/成功可否(true, false)を取得
bool = system("...")
falseコマンドを実行
pb1=system("false")#=> false if!b1 STDERR.puts"FALSE"#=> "FALSE" end
(例2) 実行/結果を取得
string = %x(...)
echoコマンドを実行
ps1=%x(echo)#=> "\n" ifs1.strip.length==0 STDERR.puts"EMPTY"#=> "EMPTY" end
実行中のRubyスクリプトのソースコード各行に連番を付与
print%x(cat #{__FILE__} | nl -ba -w1)
(参考) Rubyのみで実装
File.read(__FILE__).each_line.with_index(1)do|_s1,_i1| print_i1,"\t",_s1 end
ホームディレクトリの隠しファイルを再帰抽出し、ディレクトリとファイルを配列にする例
a1=[] # "~/" を絶対パス "/home/foo" に変換 sAbsPath=File.expand_path("~/") %x(find #{sAbsPath} -type f -name ".*").each_linedo|_s1| _s1.chomp! # ファイル名直前の "/" 位置 i1=_s1.rindex("/",-1) a1<<[_s1[..(i1-1)],_s1[(i1+1)..]]#=> (例) ["/home/foo", ".bashrc"] end # ディレクトリ順にソート a1.sort.each{|_a1|print(_a1,"\n")}
(参考) Rubyのみで実装
# 直感的な理解を期待し、敢えて File.basename(), File.dirname() を使用した。 a1=[] # "~/" を絶対パス "/home/foo" に変換 sAbsPath=File.expand_path("~/") Dir.glob("**/*",File::FNM_DOTMATCH,base:sAbsPath).eachdo|_fn| sPath=File.join(sAbsPath,_fn) # ファイルか? ifFileTest.file?(sPath) sFn=File.basename(sPath) # "." で始まるファイル名か? ifsFn[0]=="." a1<<[File.dirname(sPath),sFn]#=> (例) ["/home/foo", ".bashrc"] end end end # ディレクトリ順にソート a1.sort.each{|_a1|print(_a1,"\n")}
並列処理
[編集 ]Parallel gem で並列処理する例
出力結果は「処理が完了する順序で異なる」ことに注意してください。
配列による実装例
require'parallel' $CmdList=["sleep 2","ls -la","sleep 8"] # Windows版Ruby3.4現在、オプション in_processes: 未対応のようなので in_threads: を使用した。 Parallel.each($CmdList,in_threads:4)do|_cmd| system(_cmd.strip) end
ヒアドキュメントによる実装例
require'parallel' $CmdList=<<EOD # Ruby ruby -e 'print "Hello, Ruby!\\n"' # Perl perl -e 'print "Hello, Perl!\\n";' # Python python3 -c "print('Hello, Python!')" EOD Parallel.each($CmdList.split("\n"),in_threads:4)do|_cmd| system(_cmd.strip) end
(参考) Rubyスクリプトを動的に評価/実行するときは eval で実装
require'parallel' defSubEval(_sec=0) sleep_sec# _sec 秒停止 puts_sec# _sec を表示 end # 便宜上、ヒアドキュメントで記述します。 # 実用途では、標準入力/外部ファイルから読み込んだテキストデータを想定しています。 # 以下、意図的にエラーを混入しているので、実行して確認してみてください。 $CmdList=<<EOD SubNoExist() SubEval("Ruby") SubEval(0) SubEval(10) SubEval(5) SubEval(1) SubEval(2) EOD # 入力データに100%の信用がないときは、例外処理を実装。 Parallel.each($CmdList.split("\n"),in_threads:4)do|_cmd| _cmd.strip! begin eval(_cmd) rescue=>e puts"#{_cmd} => #{e}" end end
フィボナッチ数
[編集 ]以下はフィボナッチ数を求める例である[12] 。適正なアルゴリズムを使用することで処理速度が改善される事例は多い。
# 例えば、以下のコードが、"fib.rb"に保存されているとき、 # $ ruby ./fib.rb 10 # と実行。 defRtnFibIntr(num=0) ifnum==0 return[1,2] end if(num&1)==0 numHalf=(num/2).to_i iPm=((numHalf&1)==0?1:-1) f1,l1=RtnFibIntr(numHalf) l2=(l1*l1)-(2*iPm) f2=(f1*l1)-iPm elsif(num%8)==7 f1,l1=RtnFibIntr(num+1) f2=(2*f1)-l1 l2=(3*f2)-f1 else f1,l1=RtnFibIntr(num-1) f2=(3*f1)-l1 l2=(2*f2)-f1 end return[f2,l2] end defSubFib(num=0) ifnum>0 printnum,"\t",RtnFibIntr(num-1)[0],"\n" end end defmain() ifARGV.length>0 i1=ARGV[0].to_i SubFib(i1) end end main()
Rubyの周辺技術
[編集 ]- ActiveScriptRuby - WindowsのActiveX環境でRubyインタプリタを呼び出す(Internet Explorer限定だがHTMLに埋め込んでクライアント上で動かすスクリプト言語としてRubyを指定できるようになる)
- Apollo - Delphiを扱えるようにする(初稿: 2004年10月16日)
- dRuby - 分散オブジェクト
- DXRuby - DirectXを使用するための拡張ライブラリ
- eRuby - HTMLにRubyスクリプトの埋め込みを可能にする
- Exerb - RubyスクリプトをWindowsの実行ファイルに変換
- homebrew - macOSパッケージ管理システム
- HotRuby - JavaScriptやAdobe Flash上で動くRuby処理系
- mod_ruby - CGIより高速なApache HTTP Serverのモジュール
- Opal - RubyスクリプトをJavaScriptへ変換するコンパイラ
- Rake - ビルドツール
- RD - Rubyスクリプトに埋め込む文書形式
- RDE - 統合開発環境(最終版: 2002年10月14日)
- RSpec - ビヘイビア駆動開発のためのフレームワーク
- RubyGems - パッケージ管理システム
- Ruby on Rails - Webアプリケーションフレームワーク
- Ruby/SDL - SDLライブラリを扱えるようにする
- RWiki - RDを採用したウィキ
- Smalruby - ScratchのRuby対応版(Rubyソースを生成するScratch)とでも言うべきGUI型IDE
- YARV - 正式な処理系として採用(Ruby1.9.0以降)
- WIN32OLE - Win32APIやCOMコンポーネントを呼び出すためのライブラリ
Rubyで開発されたアプリケーション
[編集 ]- tDiary
- 影舞
- Hiki
- Chef
- Vagrant
- Ruby on Rails
- qwikWeb - メーリングリストとWikiの長所を合わせたようなシステム
- WEBrick
- Phusion Passenger
- Puppet
- mikutter
- Serverspec - サーバーの状態、設定などのテストを自動化するツール。
Rubyを組み込んだアプリケーション
[編集 ]- RPGツクールXP・RPGツクールVX
- 株式会社エンターブレインから発売されているRPG制作ソフトシリーズのうち、RPGツクールXPとRPGツクールVXでは、Ruby をツクール専用にカスタマイズした RGSSを搭載している。同シリーズの従来ソフトではあらかじめ用意された機能しか使えなかったが、RGSSにより戦闘などのシステムを一から構築する事が出来るようになった。
- RPGツクールMVからは開発言語がJavaScriptに変更になった。
エピソード
[編集 ]ブロック構造構文の選択理由
[編集 ]Ruby ではブロック構造を end で終える構文が採用されているが、Matzは他の構文が採用される可能性があったことを述べている。当時、Emacs 上で end で終える構文をオートインデントさせた例はあまりなく、Ruby 言語用の編集モードにオートインデント機能を持たせられるかどうかが問題になっていたためである[注釈 3] 。実際には数日の試行でオートインデント可能であることがわかり、現在の構文になった。C言語のような{ ... }を使った構文も検討されていたが、結局これは採用されなかった[14] 。
ゆかりのある地域
[編集 ]Rubyは日本の国産言語として知られており、特にRubyとゆかりのある次の地域は "Rubyの聖地" と呼ばれている。
- 静岡県 浜松市 - Matzが日本タイムシェア株式会社(現:TIS株式会社)の浜松市にあった研究所に勤務していた1993年にRubyの開発を開始[15] 。
- 愛知県 名古屋市 - 株式会社トヨタケーラム(現:株式会社トヨタシステムズ)在籍時、1995年にRubyをオープンソースソフトウェアとして公開[15] 。
- 島根県 松江市 - 1997年から島根県松江市に移り、同市の株式会社ネットワーク応用通信研究所 (NaCl)フェローとしてRubyの普及に尽力[15] [16] 。
Matzが書いたコードの割合
[編集 ]当初は当然、Matzが書いたコードばかりだったが、2010年前後に主要開発者の立場からは外れ、10年ほど経過した2020年9月8日現在では、RubyのCコード509,802行のうち、Matzがコミットしたのは36,437行で1割以下という状況になっていた[17] 。Matzは「意外と多いなという印象です」と語った[17] 。一方、Matzがプログラマーとして関わっているmrubyについて同様の方法で測定したところ、67,068行中、25,049行で、しかもmrubyでは他に代理コミットしてもらったものもあるので、「それを加えると32,653行で、約半分ってところですかね」とのことであった[17] 。
言語間競争とRuby
[編集 ]- Python に満足していれば Ruby は生まれなかった
- Ruby on Rails が Python ではなく Ruby で作られた理由 - 開発者のハンソンがRubyに恋をしたから
デイヴィッド・ハイネマイヤー・ハンソンが(2004年頃)Ruby on Railsを構築するのにPython(2.x?)を選ばなかった理由として「私の場合は、恋に落ちたのがRubyなのです。私はRubyに恋をしていますし、もう14年間もそうなのです。(中略)『最適なツール』などというものは存在しないのです。あなたの脳をちょうどいい具合に刺激するパズルがあるだけなのです。今日では、ほぼなんでも作ることができます。そして、それを使って、さらに何でも作れてしまうのです。これは素晴らしいことです。表現や言語、そして思考の多様性に乾杯しましょう!」と質問サイトのQuoraで本人が回答している[17] 。
- 「Rubyは死んだ」のか? 検索ワード頻度では分からない Ruby の生産性やビジネス上の価値
「Ruby Business Users Conference 2018 Winter」(2018年12月14日)より抜粋[20] 。
RubyとかRuby on Railsだと、簡単なWebアプリケーションをすぐ作ったり、あるいは、さまざまなジャンルで実際の適用例があるので、なにか困ったとき同じ問題に直面した人を探せたり、あるいはその問題を解決するRubyGemsを見つけられる。そういう点でいうと、トータルの生産性はかなり高いことがあるんですね。 なので、テクノロジーとしては、2010年代にどんどん新しく出てきた言語が持ってるあの機能がないとかこの機能がないとか、そういうカタログスペック上の欠点があるように思えても、トータルの生産性あるいは効率のよさを考えると、Ruby on Railsのビジネス上の価値は、実はそんなに下がっていないと思うんです。 先ほどのTIOBE Indexみたいなランキングは、技術者が新しいことを学ぶときに探すところで順位がついているので、ホットなトピックというんですか、新しく出てきて話題になっているものが上に来がちなんですよね。 だから、実際に仕事として、あるいは自分のプロダクトを作るときに、どんな言語を選択してどういうふうに開発したらいいのかを考えると、Rubyの持っているビジネス上の価値はそんなに下がっていないと思います。たとえ順位が下がって、表面上Rubyの人気が凋落したように見えても、ある意味「まだまだ大丈夫」が1つの見識だと思います。
どのプログラミング言語が最もよく使われているかを判断することは難しい。 [注釈 5]
注釈
[編集 ]- ^ 「ISO/IEC 30170」による厳密な言語仕様はない。2010年6月以降、言語仕様をテストするRubySpecという外部ライブラリの開発が行われていたが、Ruby 2.2.0リリース直後の2014年12月31日、開発が突然終了された。Ruby 2.2.0が「RubySpecのテストをパスしない」等、MRI側によるRubySpec軽視が一因とされている。"【悲報】Ruby開発者が使わないので「RubySpec」開発終了". 2025年9月16日閲覧。
- ^ DRYは「Don't Repeat Yourself/同じことを繰り返さない」の意。Rubyのデータ型(オブジェクト)は、動的に型変換し再利用される(同じことを繰り返す)存在であって、静的に固定型で利用される(同じことを繰り返さない)存在ではない。
- ^ Matzは1988年に Emacs に触れて以来、Emacsを使い続けている[13] 。
- ^ 原文のママ。リファレンスマニュアル2.1.0ではmatz、3.4ではMatz(2025年8月現在)。
- ^ TIOBE社はオランダにある会社で、同じオランダ出身のグイド・ヴァンロッサムが生みの親であるPythonは上位にランキングしている(2025年6月現在)。
出典
[編集 ]- ^ "Ruby 3.4.7 Released" (2025年10月7日). 2025年10月29日閲覧。
- ^ Intro - D Programming Language 1.0 - Digital Mars
- ^ Ruby コミュニティ. "Rubyとは". 2025年7月28日閲覧。
- ^ 『プログラム言語Ruby、国際規格として承認』(プレスリリース)独立行政法人情報処理推進機構、2012年4月2日。オリジナルの2012年4月3日時点におけるアーカイブ。https://web.archive.org/web/20120403184731/https://www.ipa.go.jp/about/press/20120402_2.html 。
- ^ 山田祥寛 2021, p. ii.
- ^ "Ruby用語集(Ruby 3.4 リファレンスマニュアル)". 2025年6月24日閲覧。
- ^ まつもとゆきひろ 監修, 原信一郎 著『Rubyプログラミング入門』オーム社、2000年10月。ISBN 978-4-274-06385-5。 - 「まえがき 監修者」より
- ^ まつもとゆきひろ『まつもとゆきひろ コードの世界〜スーパー・プログラマになる14の思考法』9ページ、日経Linux編集、日経BP社、2009年5月。ISBN 978-4-8222-3431-7。
- ^ "Rubyのクラスと定数の先頭をアルファベット大文字に限定しているのはなぜですか?クラス名を日本語にできないのが他の言語ではできるので少し惜しい気がします。". Quora. 2025年8月31日閲覧。
- ^ "まつもとゆきひろさん「Ruby3の目指す未来 –The Year of Concurrency–」〜RubyKaigi 2019 1日目 基調講演". gihyo.jp (2019年5月14日). 2025年8月31日閲覧。
- ^ "まつもとゆきひろさん、Rubyの変化で大事にしているルールを守りつつ「2019年までにRuby 3x3を実現したい」〜RubyKaigi 2015基調講演 1日目". gihyo.jp (2015年12月24日). 2025年9月6日閲覧。
- ^ "フィボナッチ数を高速に計算する". 2025年6月28日閲覧。
- ^ 大竹智也「本書に寄せて」『Emacs実践入門 思考を直感的にコード化し、開発を加速する』(初版第1刷)技術評論社、2012年4月5日、iiiからivページ頁。ISBN 978-4-7741-5002-4。
- ^ まつもとゆきひろ 「探訪 Ruby 第6回」『Linux Magazine』56号、株式会社アスキー、2004年。
- ^ a b c "Tech通信". 2019年3月1日閲覧。
- ^ 野田, 哲夫 (2013). "オープンソースのプログラミング言語Rubyによる地域産業振興". 情報管理 56 (6): 355–362. doi:10.1241/johokanri.56.355 . https://www.jstage.jst.go.jp/article/johokanri/56/6/56_355/_html/-char/ja .
- ^ a b c d "Rubyレベルのプログラミング言語はどのくらいの部分が発明者だけによるコードなのでしょうか?". Quora (2020年9月8日). 2022年4月19日閲覧。
- ^ 『ソフトウェアデザイン』2001年3月号(110ページ)、技術評論社、2025年8月10日閲覧。
- ^ "Ruby用語集(Ruby 2.1.0 リファレンスマニュアル)". 2025年8月10日閲覧。
- ^ ""Rubyは死んだ"のか?まつもとゆきひろ氏が語る「プログラミング言語サバイバル」とRubyの未来 - Part1". ログミーTech. 2025年3月19日閲覧。
参考文献
[編集 ]- 高橋征義、後藤裕蔵『たのしい Ruby Rubyではじめる気軽なプログラミング』まつもとゆきひろ監修、ソフトバンクパブリッシング、2002年4月。ISBN 4-7973-1408-7。 - プログラム未経験者向けの入門書。
- 高橋征義、後藤裕蔵『たのしいRuby Rubyではじめる気軽なプログラミング』まつもとゆきひろ監修(第2版)、ソフトバンクパブリッシング、2006年8月。ISBN 4-7973-3661-7。
- 高橋征義、後藤裕蔵『たのしい Ruby』まつもとゆきひろ監修(第3版)、ソフトバンクパブリッシング、2010年3月。ISBN 978-4-7973-5740-0。
- 高橋征義、後藤裕蔵『たのしい Ruby』まつもとゆきひろ監修(第4版)、ソフトバンクパブリッシング、2013年6月。ISBN 978-4-7973-7227-4。
- 高橋征義、後藤裕蔵『たのしい Ruby』まつもとゆきひろ監修(第5版)、ソフトバンクパブリッシング、2016年2月。ISBN 978-4-7973-8629-5。
- 高橋征義、後藤裕蔵『たのしい Ruby』まつもとゆきひろ監修(第6版)、ソフトバンクパブリッシング、2019年3月。ISBN 978-4-7973-9984-4。
- デビット・トーマス、アンドリュー・ハント『プログラミングRuby 達人プログラマーガイド』田和勝訳、まつもとゆきひろ監修、ピアソン・エデュケーション、2001年9月。ISBN 4-89471-453-1。
- Dave Thomas、Chad Fowler・Andy Hunt『プログラミング Ruby 言語編』田和勝訳、まつもとゆきひろ監修(第2版)、オーム社、2006年8月。ISBN 4-274-06642-8。
- Dave Thomas、Chad Fowler・Andy Hunt『プログラミング Ruby ライブラリ編』田和勝訳、まつもとゆきひろ監修(第2版)、オーム社、2006年8月。ISBN 4-274-06643-6。
- Dave Thomas、Chad Fowler・Andy Hunt『プログラミング Ruby 1.9 言語編』田和勝訳、まつもとゆきひろ監修、オーム社、2010年5月。ISBN 978-4-274-06809-6。
- Dave Thomas、Chad Fowler・Andy Hunt『プログラミング Ruby 1.9 ライブラリ編』田和勝訳、まつもとゆきひろ監修、オーム社、2010年5月。ISBN 978-4-274-06810-2。
- David Flanagan、まつもとゆきひろ『プログラミング言語 Ruby』卜部昌平監訳、長尾高弘訳、オライリー・ジャパン、2009年1月。ISBN 978-4-87311-394-4。
- まつもとゆきひろ、石塚圭樹『オブジェクト指向スクリプト言語 Ruby』アスキー〈ASCII software science : Language 11〉、1999年11月。ISBN 4-7561-3254-5。
- 山田祥寛『独習Ruby』(新版)翔泳社〈独習シリーズ〉、2021年9月13日。ISBN 978-4-7981-6884-5。
関連項目
[編集 ]- Perl
- Python
- スクリプト言語
- オブジェクト指向プログラミング
- Goby - Rubyに影響を受け、Goで実装したオブジェクト指向インタプリタ言語。Rubyの構文、実装、ライブラリ等と互換性はない。
外部リンク
[編集 ]- オブジェクト指向スクリプト言語 Ruby :Ruby公式ウェブサイト
- Rubyアソシエーション
- JISC - JISX3017 プログラム言語Ruby