Rubyのコードブロック
Rubyでは、データの繰り返し処理を行う新たな方法としてコードブロックが用意されています。このコードブロックは、Java言語の制限された繰り返し機能よりもはるかに柔軟で強力な機能です。前述の基本的な文字列操作の例では、stemmer gemを使って英単語が含まれる文字列の語幹を検索しました。次の例では、String
クラスのsplit
メソッドを使って文字列を分割し(区切り文字には空白文字を使用)、コードブロックの始まりと終わりを示す { と } で定義されたコードブロックを渡します({ と } の代わりにbeginとendを使うこともできます)。2つの | で囲まれた文字列はブロック内のローカル変数を表します。
puts "longs trips study studying banking".split(' ') puts "longs trips study studying banking".split(' ').each{|token| puts "#{token} : #{token.stem}"
このコード例を実行すると、以下の結果が得られます。
longs trips study studying banking longs : long trips : trip study : studi studying : studi banking : bank
さらに、コードブロックの有効な使用例を以下に示します。この例では、Array
クラスのcollect
メソッドを使用しています。collect
メソッドは配列の各要素を処理し、その要素をコードブロックに渡します。
require 'pp' pp ["the", "cat", "ran", "away"].collect {|x| x.upcase} pp ["the", "cat", "ran", "away"].collect {|x| x.upcase}.join(' ')
この例では、コードブロックは要素が文字列であると想定して、各要素のupcase
メソッドを呼び出しています。collect
メソッドは収集した結果を新しい配列に返します。また、結果として得られた配列の要素を、空白文字を要素の区切りに設定したjoin
メソッドを使って1つの文字列に連結しています。この出力結果は次のようになります。
["THE", "CAT", "RAN", "AWAY"] "THE CAT RAN AWAY"
コードブロックを使用するメソッドの作成
yield
メソッドを使うと、メソッドや関数の呼び出しに渡されたコードブロックを呼び出すことができます。次の例では、block_given?
メソッドを使って、コードブロックが指定された場合にyield
を呼び出しています。yield
メソッドは出力される値を返します。
def cb_test name puts "Code block test: argument: #{name}" s = yield(name) if block_given? puts "After executing an optional code block, =#{s}" end
以下の例ではcb_test
関数を2回呼び出していますが、1回目はコードブロックを指定する場合を、2回目はコードブロックを指定しない場合を示しています。
>> puts cb_test("Mark") Code block test: argument: Mark After executing an optional code block, = nil => nil >> puts cb_test("Mark") {|x| x + x} Code block test: argument: Mark After executing an optional code block, =MarkMark nil => nil >>
文字列値「Mark」は引数としてyield
に渡され、コードブロックの内部でローカル変数x
に値「Mark」が割り当てられます。その結果、コードブロックの戻り値は「MarkMark」になります。
Rubyの正規表現
Rubyでは、組み込みのRegexp
クラスを使って正規表現を処理することができます。Javaのjava.util.regex APIも同じような機能を備えていますが、Rubyの正規表現サポートの方が明らかに進んでいます。正規表現オブジェクトは、Regexp.new("[a-e]og")
のようなメソッド呼び出しを直接使っても、/[a-e]og/
のようなスラッシュで正規表現を囲む形式を使っても作成できます。正規表現とRubyの正規表現サポートについては、よくできたチュートリアルがWeb上でいくつも公開されています。以下に、=~演算子のみを使用した簡単な例を示します。
=> 4 >> "the dog ran" =~ /[a-e]og/ => 4 >> "the zebra ran" =~ /[a-e]og/ => nil
Rubyのネットワークプログラミング
Rubyにはネットワークプログラミング用の標準ライブラリも用意されています。詳しくは、私が執筆した以前の記事を参照してください。私はRubyを使って、インターネットからデータを収集し、そのデータを解析してXMLやデータベースに格納するという作業をよく行います。