Ruby 言語入門

By: Chikako Yonezawa

Abstract: 「ビデオ-Ruby言語入門」の内容を簡単に説明した記事です

この記事は、ビデオ-Ruby言語入門で説明されている内容を、簡単な文書にし、追記の説明を加えたものです。

3rdRailには、Rubyのプログラムを対話形式で入力しながら実行結果をその場で確認できる対話型 Ruby(irb)を起動する Rubyコンソールが用意されています。

ここでは、irb を使って、簡単に Ruby言語についての説明を行っていきます。

    対話型 Ruby(irb)を起動する

3rdRailを起動すると、最初に Welcomeの画面が表示されますが、ここでは、特に必要はないので、タブの横に表示されている×をクリックして、この画面を閉じます。

Hide image
Ruby01

対話型 Rubyのコンソールを起動するには、Rubyプロジェクトが必要なので、まず Rubyプロジェクトを作成します。メニューから [File|New|Other]を選び、表示されたウィザードから \Ruby\Ruby Projectを選び、Nextボタンを押します。

Hide image
Ruby02

Rubyプロジェクトを作成するための画面が表示されますので、Project nameの部分に適切な名前(ここではわかりやすいように Sampleとします)を入力します。Rubyインタプリタとの関連付けが必要ですので、Configure interpreters のリンクの部分をクリックします。

Hide image
Ruby03

表示された画面の Addボタンを押すと、Rubyのインタプリタを指定する画面が表示されるので、Browseボタンを押し、Ruby.exeを登録します。

Hide image
Ruby04

Rubyインタプリタを指定する前

Hide image
Ruby05

Rubyインタプリタが指定された後

Hide image
Ruby06

Rubyインタプリタとの関連付けが終了すると、Finishボタンが押せるようになるので、Finishボタンを押して Rubyプロジェクトを作成します。

3rdRailのデフォルトの画面表示は Rails perspectiveになっているので、これを Ruby perspectiveに変更します。画面の右上にある Open perspectiveのボタンを押し、Rubyを選択することで、画面表示を切り替えることができます。

Hide image
Ruby07

次に、画面の下部にある Consoleタブをクリックします。現在はコンソールが開いていたいので、Consoleタブの右端にある Open Consoleボタンの横の▼をクリックし、表示されたコンソールの種類から Ruby Consoleを選びます。

Hide image
Ruby08

すると、コンソールに、irbのプロンプトが表示されて入力待ちの状態になります。

実際に irbでコードを入力して、実行結果を確認していきますが、コンソール画面が小さいので、コンソールタブの右端にある Maxmizeボタンを押して、画面を大きくしておきましょう。

Hide image
Ruby09

Rubyコンソール全画面表示

Hide image
Ruby10

表示されているプロンプトはデフォルトでは、

irb(現在のバインディングレベル):行番号:ネストレベル(インデントのレベル)

となっています。

    対話型 Ruby(irb)を使う

文字列オブジェクトは、単純に「”」や「’」記号で、文字オブジェクトにしたい文字の集まりを囲うことで簡単に作成できます。

irb(main):001:0> “Hello World”
=> “Hello World”

結果として文字列オブジェクトがそのまま返却されます。

文字列オブジェクトは「+」記号で連結することができます。

irb(main):002:0> “Hello World” + “ Joe”
=> “Hello World Joe”

数式は計算された結果が返却されます。

irb(main):003:0> 2 + 9 * 200
=> 1802

オブジェクトが何のクラスに属するかを知るには、classメソッドを使用します。classメソッドを使うには、オブジェクトの後ろに .classを付けます。

irb(main):004:0> “Hello World”.class
=> String

結果として、”Hello World”文字列オブジェクトは Stringクラスであることが示されます。

オブジェクトが使用できるメソッドの一覧を得るには、methodsメソッドを使用します。

irb(main):005:0> “Hello World”.methods
=> [“Chop!”, “concat”, “upcase!”, “collect”, “sort”, “member?”, “methods”, “chop”, “repleace” ……… ]

メソッド名の一覧が文字列配列で返却されます。(表示される結果については省略しています)

文字列の長さを調べるには lengthメソッド(または sizeメソッド)を使用します。

irb(main):006:0> “Hello World”.length
=> 11

返却されるのは文字数ではなく、バイト数が返却されます。日本語の文字数は splitメソッドを使い、エンコードされている文字コードを指定することで、正しく文字数を得ることができます。

upcaseメソッドは、文字列を大文字に変換します。

irb(main):007:0> “Hello World”.upcase
=> “HELLO WORLD”

Rubyには時間を表すための Timeクラスが用意されています。

irb(main):008:0> Time.class
=> class

Time自身の属性はクラスなので、結果は classと返却されています。

現在の時刻を知るには、nowメソッドを使用します。

irb(main):009:0> Time.now
=> Wed Sep 26 09:27:05 -0700 2007

現在の時刻が Timeオブジェクトの形式で返却されます。

返却される Timeオブジェクトは、Timeクラスとなります。

irb(main):010:0> Time.now.class
=> Time

Timeオブジェクトを文字列オブジェクトに変換するには to_sメソッドを使用します。

irb(main):011:0> Time.now.to_s
=> “Wed Sep 26 09:27:05 -0700 2007”

結果は文字列オブジェクトで返却されます。

本当に文字列オブジェクト(Stringクラス)かどうか classメソッドで確かめます。

irb(main):012:0> Time.now.to_s.class
=> String

Stringクラスと返却され、to_sメソッドの結果が文字列オブジェクトであることが解ります。

メソッドを組み合わせることで、細かい処理を行わせることができます。

例えば、文字列を分割する splitメソッドと、配列に変換する to_aメソッドを使い、現在の時間を配列に格納し、5番目の要素(配列の要素は 0から始まるので実際は6番目の要素)を取り出すという処理を以下の一文で記述することができます。

irb(main):013:0> Time.now.to_s.split.to_a[5]
=> “2007”

まず、現在の時間が to_sメソッドによって文字列に変換され、次に splitメソッドによって “Wed”, “Sep”, “26”, “09:27:05”, “-0700”, “2007”の6つの文字列に分解されます。to_aメソッドにより6つの文字列が格納された配列に変換され、[5]の指定により、その5番目(配列の要素は、0から始まるので実際は6番目)の要素である “2007”が返却されます。

単純に年だけ取り出すのであれば、yearメソッドを使います。

irb(main):014:0> Time.now.year
=> 2007

この結果は Timeオブジェクトではなく、数値(Fixnum)で返却されます。

irbに入力した内容は irbのワークスペースに保存されます。一度定義した変数・メソッド・クラスは、このワークスペースに記録されているので、定義した後に利用することができます。

たとえば、以下のような Stringクラスを拡張して、hi_joeメソッドを追加するコードを記述します。

irb(main):015:0> class String
irb(main):016:1> def hi_joe
irb(main):017:2> self + “ Joe”
irb(main):018:2> end
irb(main):019:1> end
=> nil

返却された nilは、メソッドの定義とその実行に対する戻り値であることを示しています。

このコードをインデントを付けて解りやすく記述すると以下のようになり、プロンプトのネストレベルの数字の変化が表しているネストの意味がわかるかと思います。

  class String
    def hi_joe
      self + “ Joe”
    end
  end

この hi_joeメソッドは、受け取った文字列のあとに “ Joe”を連結する動作を行います。

定義した、クラス、メソッドは記録されているので、そのまま使用することができます。

irb(main):020:0> “Hello World”.hi_joe
=> “Hello World Joe”
irb(main):021:0> “New String”.hi_joe
=> “New String Joe”

文字列配列 aを作成するには、次のように指定します。

irb(main):022:0> a = %w{Joe Tom Fred}
=> [“Joe”, “Tom”, “Fred”]

“Joe”, “Tom”, “Fred”の文字列が格納された配列 aが作成されました。

文字列配列 aの 1番目の要素(配列の要素は 0から始まりますので、実際には2番目)の要素を取り出すには

irb(main):023:0> a[1]
=> “Tom”

とします。

先頭の要素は [0]を指定することで取り出すことができます。

irb(main):024:0> a[0]
=> “Joe”

また、存在しない場合は nilが返却されます。

irb(main):025:0> a[99]
=> nil

ここで、もうひとつ文字列配列 bを作成します。

irb(main):026:0> b = %w{Tom Fred}
=> [“Tom”, “Fred”]

“Tom”, “Fred” の文字列が格納された配列 bが作成されました。

Rubyでは、配列の集合演算をすることができます。

irb(main):027:0> a – b 
=> [“Joe”]

上の式は、aの文字列配列[“Joe”, “Tom”, “Fred”]と bの文字列配列[“Tom”, “Fred”]を使って、aの文字列配列から bの文字列配列に含まれていない要素を取り出すという演算を行っています。

イテレータ(繰り返し)や、入出力に関して簡単に説明します。

Ruby では eachメソッドを使用して繰り返しの処理を記述することができます。

irb(main):028:0> a.each do |x|
irb(main):029:1* puts x
irb(main):030:1> end
Joe
Tom
Fred
=> [“Joe”, “Tom”, “Fred”]

上記で定義した文字列配列 aに対し、eachメソッドはその集合体の内容を1つずつ順番に取り出します。putsは文字列に改行文字を補って出力するメソッドです。

a.each によって、文字列配列 aから “Joe”, “Tom”, “Fred”の文字列が順に取り出され、変数 xに格納されます。putsは、変数 xに格納された文字列を改行文字を補って出力します。

do...endブロックを、ブレーズ「{}」を使って1行で書くこともできます。

irb(main):031:0> a.each {|c| puts c}
Joe
Tom
Fred
=> [“Joe”, “Tom”, “Fred”]

1行のブロックの場合はブレーズを、複数行の場合は do…endを使うというのが Rubyの標準になりつつある習慣のようです。

メソッドの中で yield文を使って、ブロックをメソッドのように呼び出すことができます。

新しいメソッド operate_onを定義し、引数として x, yを定義します。メソッドの中では yield文で、この2つの引数を対応するブロックに引き渡します。

irb(main):032:0> def operate_on x, y
irb(main):033:1>   yield x, y
irb(main):034:1> end
=> nil

実際にこのメソッドを使ってブロックに書かれた処理を実行させます。

irb:main-035:0> operate_on(10, 20) {|a, b| a + b}
=> 30

operate_onの後に書かれた2つの引数 10, 20が yield文により、後に書かれたブロック {|a, b| a + b}に引き渡され処理が行われます。ブロック内の aには引数の 10が、bには 20が引き渡され、その後に書かれている a + bの式を実行し、10+20で 30という計算結果が返却されています。

同様に、

irb:main-036:0> operate_on(10, 20) {|a, b| a - b}
=> -10

この場合は、10-20が実行され -10が返却されます。

以上、irbを使って、簡単にRuby言語の説明を行いました。Rubyを始めるきっかけになれば幸いです。




Server Response from: ETNASC03