3rdRailには、Rubyのプログラムを対話形式で入力しながら実行結果をその場で確認できる対話型 Ruby(irb)を起動する Rubyコンソールが用意されています。
文字列オブジェクトは、単純に「”」や「’」記号で、文字オブジェクトにしたい文字の集まりを囲うことで簡単に作成できます。
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を始めるきっかけになれば幸いです。
Connect with Us