Movatterモバイル変換


[0]ホーム

URL:


コンテンツにスキップ
Wikipedia
検索

Ruby

出典: フリー百科事典『ウィキペディア(Wikipedia)』
曖昧さ回避この項目では、プログラミング言語について説明しています。「ルビー」・「ルビ」の他の使い方については「ルビー (曖昧さ回避)」をご覧ください。
Ruby
Rubyのロゴ
パラダイム関数型プログラミング命令型プログラミングオブジェクト指向プログラミングリフレクション ウィキデータを編集
登場時期1995年 (30年前) (1995)
開発者まつもとゆきひろ ウィキデータを編集
最新リリース3.4.7[1] ウィキデータを編集/2025年10月7日 (47日前)
型付け強い動的型付け,ダック・タイピング
主な処理系MRI,YARV,JRuby,IronRuby, MacRuby
影響を受けた言語AdaDylanPerlPythonSmalltalkC++CLUEiffelLISPBASICLuaEmacs ウィキデータを編集
影響を与えた言語D言語[2]GroovySwiftCrystalScalaElixir
プラットフォームMicrosoft WindowsLinux*BSDmacOS ウィキデータを編集
ライセンスRubyライセンス、GPL 2.0、2条項BSDライセンス ウィキデータを編集
ウェブサイトwww.ruby-lang.orgウィキデータを編集
拡張子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とのデュアルライセンスで頒布されている。

設計思想

[編集]

Matzは「Rubyの言語仕様策定において最も重視しているのはストレスなくプログラミングを楽しむことである (enjoy programming)」と述べている。

Ruby には Perl や Python とは決定的に違う点があり、それこそが Ruby の存在価値なのです。それは「楽しさ」です。私の知る限り、Ruby ほど「楽しさ」について焦点を当てている言語は他にありません。Ruby は純粋に楽しみのために設計され、言語を作る人、使う人、学ぶ人すべてが楽しめることを目的としています。しかし、ただ単に楽しいだけではありません。Ruby は実用性も十分です。実用性がなければ楽しめないではありませんか。 — まつもとゆきひろ、Ruby プログラミング入門 まえがき 監修者よりのページ

Matzは『まつもとゆきひろ コードの世界 スーパー・プログラマになる14の思考法』でもRubyの開発理由を次のように述べている。

「なぜRubyを開発したのか」。そのように問われるときに、もっとも適切な答えは、Linux開発者であるリーナス・トーバルズの言葉と同じではないかと思います。『それがぼくには楽しかったから — まつもとゆきひろ コードの世界 スーパー・プログラマになる14の思考法 P.9

クラス名はアルファベットの大文字から始めるという制約があり、日本語などの非ASCII文字のみでクラス名を定義する方法がない。この件についてMatzは以下のように語っており、英語を共通言語として使うべきであるという立場を表明している[7]

2文字目以降は自由なので、もしどうしても日本語が使いたいのであれば、少々不自然にも見えますが、先頭だけ大文字の接頭辞をつけるのはどうでしょうか。しかし、私個人としては、日本語の変数名などを使うことは、そのプログラムを読む人の範囲を日本語が読める人に限定してしまうことになるので、ひどくもったいないのではないかと感じています。そこで、この点を積極的に改善する気にはなれないのです。

静的型について、Matzは「(基本設計思想である動的型付けを維持し)静的型付けを導入しない」意思を改めて示した[8]

Rubyと同様のスクリプト言語(インタープリタ型言語)であるPythonPHPPerlでは静的型を導入しており、Rubyも型を導入するべきでは、と長年言われてきました。しかしまつもとさんは「Rubyに型を取り入れたくない(DRYではないから⁠[注釈 2])⁠」⁠、「⁠型宣言することはコンピュータに使われているような気になる」と述べ、Rubyでは静的型は導入しない方針を示しました。

その代わり、静的解析を導入し、型チェックを行えるようにすることを明らかにしました。(中略)静的解析に期待してほしい、とまつもとさんは述べました。

静的解析は、Ruby 3.0.0から実装された。

MINASWANMatzがniceだから俺らもniceでいよう」[9]

そしてRuby(中略)コミュニティを表現した標語に"MINASWAN"というものがあると紹介しました。これは"Matz is nice so we are nice"の略で、もめごとがあっても「matzがniceだから俺らもniceでいよう」と、なだめることが海外のメーリングリストではよく見られるそうです。(中略)今ではスローガンにまで昇華しています。(中略)日本のRubyコミュニティにこの特質を逆輸入したいと考え、講演の最初に取り上げたと述べました。

実装

[編集]

公式

[編集]

MRI

[編集]
MRI(Matz Ruby Interpreter)あるいは、CRubyC言語で書かれていることに由来する)と呼ばれる。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

[編集]
MacRubyは、macOSのRuby実装。Cocoaを含む様々なフレームワークとの連携が可能。RubyCocoaの問題点を解決するために開発されている。

Rubinius

[編集]
Rubiniusは、仮想機械でRubyを実行するJIT方式のバイトコードインタプリタ。大部分がRubyで実装されている。

MagLev

[編集]
MagLevは、Smalltalk 仮想機械のRuby実装MagLev

mruby

[編集]
mrubyは、組み込みシステム向けの軽量版。家電製品の他、スマートフォンコンピュータゲームなどでの使用を想定している。

仮想機械

[編集]

Parrot

[編集]
Parrotで動作させるための実装なども開発されている。

コード例

[編集]

ここでは、実用途に即したコード例を中心に記載します。
クロスプラットフォームでの使用を考慮していますが、Unix系コマンドを利用できない環境では正常に動作しないことがあります。
なお、ウィキブックスには、より多くの基本的なコード例が記載されています。

基本的なコード

[編集]

文字列・数値等すべてのデータがオブジェクト

p-199.abs#=> 199p"ruby is cool".length#=> 12p"Rick".index("c")#=> 2p"Nice Day Isn't It?".split(//).uniq.sort.join#=> " '?DINaceinsty"

おまじない

[編集]

ヘッダ情報の付与

#!/usr/bin/env ruby#coding:utf-8puts"本コードは、これ以降に書く。"
1行目:シバン行。使用するインタプリタを記述(Windows系実装では無視される)。
2行目:使用する文字コードを記述。ここではutf-8を指定。

変数と定数

[編集]

ローカル変数

[編集]

小文字 または '_' で始まる識別子は ローカル変数

var=123pvar=456#=> 456
_v=123p_v=456#=> 456

グローバル変数

[編集]

'$' で始まる識別子は グローバル変数

$var=123p$var=456#=> 456

定数

[編集]

アルファベット大文字 [A-Z]で始まる識別子は 定数

Var=123pVar=456#=> 警告: 定数 Var はすでに初期化されています

コレクション

[編集]

コレクションに関する例

配列

[編集]

配列の作成と使用法

a1=[1,"hi",3.14,1,2,[4,5]]pa1[2]#=> 3.14pa1[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=<<EODAB CDEODpS2.split("\n").map{|_v|_v.strip}# %w記法で配列に変換p%w(A B\ C D)p%w(AB\ CD)
# %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: hoth10.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)doputsexitend# キー入力print"[Y/n] ? "ps1=STDIN.gets.strip.upcaseprint"例1-1: "ifs1=="Y"putstrueelsifs1=="N"putsfalseelseputsnilendprint"例1-2: "puts(ifs1=="Y"trueelsifs1=="N"falseelsenilend)print"例2:   "putss1=="Y"?true:nilprint"例3:   "printtrueifs1=="Y"putsprint"例4:   "puts(cases1when"Y"truewhen"N"falseelsenilend)

ブロック

[編集]

ブロックは{ ... } またはdo ... end によって囲まれたコード列である。
一行で収まるときは{ ... }、複数行にまたがるときはdo ... end が使用される。

# { ... }"Hello, Ruby!".split{|_s1|puts_s1}
# do ... end"Hello, Ruby!".splitdo|_s1|puts_s1end

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=[]fori1ina1a2<<i1*2endpa2#=> [2, 4, 10, 26, 42]
while
[編集]
a1=[1,2,5,13,21]i1=0whilei1<a1.lengtha1[i1]*=2i1+=1endpa1#=> [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]# mapa2=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}putsprint(s1*3),"\n"
連続する数字の繰り返し処理
[編集]
# 連続する数字の配列を作成p(1..5).to_a#=> [1, 2, 3, 4, 5]
# 断続する数字をキーにした空のハッシュを作成hi1={}[0..5,10,20..21,30].eachdo|e1|ife1.class==Rangee1.eachdo|i1|hi1[i1]=""endelsehi1[e1]=""endendphi1#=> {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]=""endphi1#=> {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行ずつ")endends1=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.writes2endputs%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'# URLUrl="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")endendrescue=>epeend

クロージャ

[編集]

クロージャとなるようなブロックの引数渡し

# オブジェクトのインスタンス変数(変数名の頭に@が付く)でブロックを記憶。defremember(&p)@block=pend# nameを受け取るブロックを引数に、上記のメソッドを呼び出す。remember{|name|puts"Hello,#{name}!"}# 後に必要になった時点でクロージャを呼び出す。@block.call("Ruby")#=> "Hello, Ruby!"

メソッドからクロージャを返す例

defcreate_set_and_get(value=0)returnproc{|x|value=x},proc{value}endsetter,getter=create_set_and_getpsetter.call(21)#=> 21pgetter.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_readergetter メソッドのみの定義である。なおメソッド中では最後に評価された式が返り値となり、明示的なreturnは省略できる。

classPersondefinitialize(name,age)@name,@age=name,ageenddef<=>(person)@age<=>person.ageenddefto_s"#{@name} (#{@age})"endattr_reader:name,:ageendgroup=[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 の例外ありperescue=>e# 例外ありpeelse# 例外なしのとき実行ensure# 必ず実行end

例外なし

# 下記を出力#   Hello Ruby!#   else#   ensurebeginputs"Hello Ruby!"rescue=>eputs"rescue",eelseputs"else"ensureputs"ensure"end

例外はraise ... でも発火できる。

例外ありraise "エラー"

# 下記を出力#   rescue#   エラー#   ensurebeginraise"エラー"rescue=>eputs"rescue",eelseputs"else"ensureputs"ensure"end

例外ありraise ArgumentError, "Argument エラー"

# 下記を出力#   ArgumentError rescue#   Argument エラー#   ensurebeginraiseArgumentError,"Argument エラー"rescueArgumentError=>eputs"ArgumentError rescue",erescue=>eputs"rescue",eelseputs"else"ensureputs"ensure"end

不向きな処理

[編集]

ベンチマークテストで使用される以下のようなコードを実行したとき、処理速度が著しく低下することがある。

i1=1000000whilei1<=1010000i2=i1-1i3=2whilei3<=i1if(i1%i3)==0breakelsifi3==i2putsi1.to_sbreakendi3+=1endi1+=1end

外部コマンド等の利用

[編集]

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")#=> falseif!b1STDERR.puts"FALSE"#=> "FALSE"end

(例2) 実行/結果を取得

string = %x(...)

echoコマンドを実行

ps1=%x(echo)#=> "\n"ifs1.strip.length==0STDERR.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",_s1end

ホームディレクトリの隠しファイルを再帰抽出し、ディレクトリとファイルを配列にする例

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"]endendend# ディレクトリ順にソート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# Rubyruby -e 'print "Hello, Ruby!\\n"'# Perlperl -e 'print "Hello, Perl!\\n";'# Pythonpython3 -c "print('Hello, Python!')"EODParallel.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=<<EODSubNoExist()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!begineval(_cmd)rescue=>eputs"#{_cmd} =>#{e}"endend

フィボナッチ数

[編集]

以下はフィボナッチ数を求める例である[10]。適正なアルゴリズムを使用することで処理速度が改善される事例は多い。

# 例えば、以下のコードが、"fib.rb"に保存されているとき、# $ ruby ./fib.rb 10# と実行。defRtnFibIntr(num=0)ifnum==0return[1,2]endif(num&1)==0numHalf=(num/2).to_iiPm=((numHalf&1)==0?1:-1)f1,l1=RtnFibIntr(numHalf)l2=(l1*l1)-(2*iPm)f2=(f1*l1)-iPmelsif(num%8)==7f1,l1=RtnFibIntr(num+1)f2=(2*f1)-l1l2=(3*f2)-f1elsef1,l1=RtnFibIntr(num-1)f2=(3*f1)-l1l2=(2*f2)-f1endreturn[f2,l2]enddefSubFib(num=0)ifnum>0printnum,"\t",RtnFibIntr(num-1)[0],"\n"endenddefmain()ifARGV.length>0i1=ARGV[0].to_iSubFib(i1)endendmain()

Rubyの周辺技術

[編集]

Rubyで開発されたアプリケーション

[編集]

Rubyを組み込んだアプリケーション

[編集]
RPGツクールXP・RPGツクールVX
株式会社エンターブレインから発売されているRPG制作ソフトシリーズのうち、RPGツクールXPRPGツクールVXでは、Ruby をツクール専用にカスタマイズしたRGSSを搭載している。同シリーズの従来ソフトではあらかじめ用意された機能しか使えなかったが、RGSSにより戦闘などのシステムを一から構築する事が出来るようになった。
RPGツクールMVからは開発言語がJavaScriptに変更になった。

エピソード

[編集]

ブロック構造構文の選択理由

[編集]

Ruby ではブロック構造をend で終える構文が採用されているが、Matzは他の構文が採用される可能性があったことを述べている。当時、Emacs 上でend で終える構文をオートインデントさせた例はあまりなく、Ruby 言語用の編集モードにオートインデント機能を持たせられるかどうかが問題になっていたためである[注釈 3]。実際には数日の試行でオートインデント可能であることがわかり、現在の構文になった。C言語のような{ ... }を使った構文も検討されていたが、結局これは採用されなかった[12]

ゆかりのある地域

[編集]

Rubyは日本の国産言語として知られており、特にRubyとゆかりのある次の地域は "Rubyの聖地" と呼ばれている。

Matzが書いたコードの割合

[編集]

当初は当然、Matzが書いたコードばかりだったが、2010年前後に主要開発者の立場からは外れ、10年ほど経過した2020年9月8日現在では、RubyのCコード509,802行のうち、Matzがコミットしたのは36,437行で1割以下という状況になっていた[15]Matzは「意外と多いなという印象です」と語った[15]。一方、Matzがプログラマーとして関わっているmrubyについて同様の方法で測定したところ、67,068行中、25,049行で、しかもmrubyでは他に代理コミットしてもらったものもあるので、「それを加えると32,653行で、約半分ってところですかね」とのことであった[15]

言語間競争とRuby

[編集]
Python に満足していれば Ruby は生まれなかった

(1993年頃)PerlPython(0.9x?)は、Matzが理想とするオブジェクト指向モデルを実現するに至っていなかった。[16]
matz[注釈 4]がPythonに満足していればRubyは生まれなかったであろう」[17]

Ruby on Rails が Python ではなく Ruby で作られた理由 - 開発者のハンソンがRubyに恋をしたから

デイヴィッド・ハイネマイヤー・ハンソンが(2004年頃)Ruby on Railsを構築するのにPython(2.x?)を選ばなかった理由として「私の場合は、恋に落ちたのがRubyなのです。私はRubyに恋をしていますし、もう14年間もそうなのです。(中略)『最適なツール』などというものは存在しないのです。あなたの脳をちょうどいい具合に刺激するパズルがあるだけなのです。今日では、ほぼなんでも作ることができます。そして、それを使って、さらに何でも作れてしまうのです。これは素晴らしいことです。表現や言語、そして思考の多様性に乾杯しましょう!」と質問サイトのQuoraで本人が回答している[15]

「Rubyは死んだ」のか? 検索ワード頻度では分からない Ruby の生産性やビジネス上の価値

「Ruby Business Users Conference 2018 Winter」(2018年12月14日)より抜粋[18]

RubyとかRuby on Railsだと、簡単なWebアプリケーションをすぐ作ったり、あるいは、さまざまなジャンルで実際の適用例があるので、なにか困ったとき同じ問題に直面した人を探せたり、あるいはその問題を解決するRubyGemsを見つけられる。そういう点でいうと、トータルの生産性はかなり高いことがあるんですね。なので、テクノロジーとしては、2010年代にどんどん新しく出てきた言語が持ってるあの機能がないとかこの機能がないとか、そういうカタログスペック上の欠点があるように思えても、トータルの生産性あるいは効率のよさを考えると、Ruby on Railsのビジネス上の価値は、実はそんなに下がっていないと思うんです。先ほどのTIOBE Indexみたいなランキングは、技術者が新しいことを学ぶときに探すところで順位がついているので、ホットなトピックというんですか、新しく出てきて話題になっているものが上に来がちなんですよね。だから、実際に仕事として、あるいは自分のプロダクトを作るときに、どんな言語を選択してどういうふうに開発したらいいのかを考えると、Rubyの持っているビジネス上の価値はそんなに下がっていないと思います。たとえ順位が下がって、表面上Rubyの人気が凋落したように見えても、ある意味「まだまだ大丈夫」が1つの見識だと思います。

どのプログラミング言語が最もよく使われているかを判断することは難しい。[注釈 5]

注釈

[編集]
  1. ^「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日閲覧。
  2. ^DRYは「Don'tRepeatYourself/同じことを繰り返さない」の意。Rubyのデータ型(オブジェクト)は、動的に型変換し再利用される(同じことを繰り返す)存在であって、静的に固定型で利用される(同じことを繰り返さない)存在ではない。
  3. ^Matzは1988年に Emacs に触れて以来、Emacsを使い続けている[11]
  4. ^原文のママ。リファレンスマニュアル2.1.0ではmatz、3.4ではMatz(2025年8月現在)。
  5. ^TIOBE社はオランダにある会社で、同じオランダ出身のグイド・ヴァンロッサムが生みの親であるPythonは上位にランキングしている(2025年6月現在)。

出典

[編集]
  1. ^Ruby 3.4.7 Released” (2025年10月7日). 2025年10月29日閲覧。
  2. ^Intro - D Programming Language 1.0 - Digital Mars
  3. ^Ruby コミュニティ. “Rubyとは”. 2025年7月28日閲覧。
  4. ^プログラム言語Ruby、国際規格として承認』(プレスリリース)独立行政法人情報処理推進機構、2012年4月2日。オリジナルの2012年4月3日時点におけるアーカイブhttps://web.archive.org/web/20120403184731/https://www.ipa.go.jp/about/press/20120402_2.html 
  5. ^山田祥寛 2021, p. ⅱ.
  6. ^Ruby用語集(Ruby 3.4 リファレンスマニュアル)”. 2025年6月24日閲覧。
  7. ^Rubyのクラスと定数の先頭をアルファベット大文字に限定しているのはなぜですか?クラス名を日本語にできないのが他の言語ではできるので少し惜しい気がします。”. Quora. 2025年8月31日閲覧。
  8. ^まつもとゆきひろさん「Ruby3の目指す未来 –The Year of Concurrency–」〜RubyKaigi 2019 1日目 基調講演”. gihyo.jp (2019年5月14日). 2025年8月31日閲覧。
  9. ^まつもとゆきひろさん、Rubyの変化で大事にしているルールを守りつつ「2019年までにRuby 3x3を実現したい」〜RubyKaigi 2015基調講演 1日目”. gihyo.jp (2015年12月24日). 2025年9月6日閲覧。
  10. ^フィボナッチ数を高速に計算する”. 2025年6月28日閲覧。
  11. ^大竹智也「本書に寄せて」『Emacs実践入門 思考を直感的にコード化し、開発を加速する』(初版第1刷)技術評論社、2012年4月5日、iiiからivページ頁。ISBN 978-4-7741-5002-4 
  12. ^まつもとゆきひろ 「探訪 Ruby 第6回」『Linux Magazine』56号、株式会社アスキー、2004年。
  13. ^abcTech通信”. 2019年3月1日閲覧。
  14. ^野田, 哲夫 (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. 
  15. ^abcdRubyレベルのプログラミング言語はどのくらいの部分が発明者だけによるコードなのでしょうか?”. Quora (2020年9月8日). 2022年4月19日閲覧。
  16. ^ソフトウェアデザイン』2001年3月号(110ページ)、技術評論社、2025年8月10日閲覧 
  17. ^Ruby用語集(Ruby 2.1.0 リファレンスマニュアル)”. 2025年8月10日閲覧。
  18. ^“Rubyは死んだ”のか?まつもとゆきひろ氏が語る「プログラミング言語サバイバル」とRubyの未来 - Part1”. ログミーTech. 2025年3月19日閲覧。

参考文献

[編集]
出典は列挙するだけでなく、脚注などを用いてどの記述の情報源であるかを明記してください。 記事の信頼性向上にご協力をお願いいたします。2021年2月
  • 高橋征義、後藤裕蔵『たのしい 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 
  • まつもとゆきひろ『まつもとゆきひろ コードの世界~スーパー・プログラマになる14の思考法』日経Linux編集、日経BP社、2009年5月。ISBN 978-4-8222-3431-7 
  • 山田祥寛『独習Ruby』(新版)翔泳社〈独習シリーズ〉、2021年9月13日。ISBN 978-4-7981-6884-5 

関連項目

[編集]

外部リンク

[編集]
ウィキメディア・コモンズには、Rubyに関連するカテゴリがあります。
ウィキブックスにRuby関連の解説書・教科書があります。
実装
IDE
アプリケーション
ライブラリ
フレームワーク
サーバソフトウェア
人物
その他
コンピュータ・プログラミング言語
低水準言語
高水準言語
1950年代
1960年代
1970年代
1980年代
1990年代
2000年代
2010年代
2020年代
架空の言語
全般
解説
開発
OS英語版
ソフトウェア
ホスティング
団体
標準化団体
開発支援団体
ライセンス
指針
主要例
その他
課題
特性上の課題
対立と論争
その他
一覧
国立図書館
その他
代表的なトピックこのページへのWP:PRIRDR用リダイレクトは「Ruby (代表的なトピック)」です。
https://ja.wikipedia.org/w/index.php?title=Ruby&oldid=107340087」から取得
カテゴリ:
隠しカテゴリ:

[8]ページ先頭

©2009-2025 Movatter.jp