プログラム・プロブレム

第九回 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:今回は以上だ。それじゃあな。

第九回 終了


一覧に戻る