プログラム・プロブレム
第九回 Ruby概要(Ruby)
I はじめに
初(以下H):第九回は、がらっと趣向を変えて Ruby 概要だ。
涼(以下S):日本発祥のスクリプト言語 Ruby の概要について説明していきます。
H:日本語の情報が比較的多くて、コミュニティも大きいからお勧めの言語の一つだぞ。
S:ちょっと前に Ruby on Rails のおかげで一躍有名になりましたね。
II 特徴
H:前回の分類では、弱い型付け、命令型、インタプリタ型だったな。
S:つまり、変数自体には型が無くて、どんなオブジェクトでも入れられます。
H:ブロック区切りは「{}」じゃなくて、「begin」「end」方式になるぞ。
S:クラスは単一継承ですが、モジュールによる mixin で動作を追加できます。
H:例外と大域脱出(いわゆる try-catch)もあるな。
S:あと特徴的なのがブロックによる内部イテレータですね。
H:言語の方針としては「ユーザの驚きが最小になる」のが目標だそうだ。
S:文法としても簡単なので、覚えやすいと思います。
H:書き捨てのツールからWebアプリまで、広い範囲で利用できるスクリプト言語だな。
III 簡易文法
条件分岐
01:if 3 < 4
02: puts( 'True' )
03:elsif 0 > 1
04: puts( "False" )
05:else
06: puts( "Never executed." )
07:end
S:というわけで、最初は条件分岐です。
H:普通に if 文だな。
S:最後が end で閉じるのと、「elsif」があるのが特徴ですかね。
puts('True') if true
H:こんな事もできるぞ。「if 節」と呼ばれてるな。
S:あとは反対の条件として「unless」が使えます。「if not」の意味ですね。
ループ
01:while bLoop
02: # いろいろな処理
03:end
H:続いてループだ。これは while ループの例だな。
S:変数 bLoop が真である間ずっと回るわけですね。
H:この逆の条件が「until」だ。「while not」の意味だな。
01:5.each do |i|
02: puts i
03:end
S:これが for ループの代わりです。C 系だと「for(int i=0;i<5;++i)」に相当しますね。
H:出力は 5行で、0~4 だな。
S:ちなみに、ホントの for ループも存在するんですが、あんまり使われません。
H:というわけで説明はパスだ。
例外
01:begin
02: raise "throwing this string."
03: puts "not reached."
04:rescue => e
05: puts "Exception occured : " + e.to_s
06:ensure
07: puts "finished."
08:end
S:C++ とか Java の例外とはキーワードが違うので注意です。
H:投げるのが「raise」で、受け取るのが「rescue」だな。
S:それで、finally の代わりが「ensure」になります。
H:02行目で raise されるから、03行目は実行されないというわけだ。
大域脱出
01:catch(:loop1) {
02: for i in 1..2
03: for j in 1..2
04: throw :loop1, j
05: end
06: end
07:}
S:こっちに「throw」と「catch」が使われています。
H:throw で第一引数に指定した名前の catch までジャンプするんだ。
S:その時の返り値が throw の第二引数になります。
H:上の例だと i = 1、j = 1 の状態で throw になるから catch ブロックの返り値は 1 になるな。
S:ちょっとややこしいですが、複数階層のブロックから抜け出す時などに使います。
クラス定義
01:class PlusN
02: def initialize(n)
03: @n = n
04: end
05: def getResult(v)
06: return v + @n
07: end
08:end
09:
10:plusthree = PlusN.new(3)
11:puts "2 + 3 = " + plusthree.getResult(2)
H:01~08行目がクラス定義だな。
S:02~04行目がコンストラクタ定義です。C++ ではクラス名と同じ PlusN になりますが、Ruby では「initialize」固定です。
H:メンバ変数は頭に「@」が付加される。
S:つまり、ここでやってることは第七回の PlusN クラスと一緒ですね。
H:使い方もちょっとだけ違うな。オブジェクトの生成は「クラス名.new(引数)」だ。
S:10行目で変数 plusthree の型が指定されてない点が弱い型付けの特徴ですね。
IV 特徴的な言語要素
拡張データ型
01:array = [1, 2, "test", 3.4]
02:hash = { :key => 'value', 3 => "Three", 'four' => 4 }
03:range = 3..5
H:01行目は「配列」だ。データの並びを格納できる。ちなみにデータ型は違っててもいい。
S:02行目は「ハッシュ」です。キーと値の組み合わせを格納できます。
H:そして03行目が「範囲」だ。この場合は3~5だな。
内部イテレータ
01:[1, 3, 5, 7, 9].each do |i|
02: puts( (i + 1) )
03:end
S:これが珍しいですね。繰り返す処理をブロックとして渡すイテレータです。
H:そうすると、データの内部で自動的に繰り返しを実行してくれるわけだ。
S:上の例では、1、3、5、7、9 という配列の中身が順に i に代入されつつブロックが実行されますね。
特異クラス定義
01:obj = "Hello!"
02:class << obj
03: def hello
04: puts self
05: end
06:end
07:
08:obj.hello
H:Ruby の最大の特徴はコレかもしれん。
S:なんと、オブジェクト一つ一つを実行中に拡張できるんです。
H:上の例だと "Hello!" という文字列オブジェクトに対してメンバ関数 hello を定義している。
S:それを08行目で呼び出すと、自分自身を puts で表示するわけです。
H:このスゴさを理解するにはしばらくかかるかもしれないが、非常に強力な機能だぞ。
V 終わりに
S:以上が作者さんの覚えてる Ruby の解説でした。
H:色々抜けとか間違いがあるかもしれないので、正しい情報は公式サイトを参照してくれ。
S:シンプルな割に機能も豊富で便利な言語です。初学者に向いてそうですね。
H:日本語の情報が豊富なのも良い点だな。
S:これで興味を持っていただけたら幸いですね。
H:今回は以上だ。それじゃあな。
第九回 終了
一覧に戻る