Rubyのメソッドの働きをちょっと確認したい場合は以下の方法を覚えておく と良いだろう。
-e
オプション
ruby
コマンドに-e
オプションをつけると、
次のコマンドライン引数をRubyの文と解釈して直接解釈実行してくれる。
Rubyの文全体が1個の引数になるように、シングルクォート
('')で括る。
% ruby -e 'printf "Hello!\n"'
Hello
irb
コマンド
Rubyプログラムを1行ずつ対話実行する。コマンドラインから
irb
と実行してみよう。
% irb
irb(main):001:0>
ここに、Rubyの文を入れ、Returnを押すと即座に結果が得られる。
irb(main):001:0> x = 5 5 irb(main):002:0> y = x**3 125
ゲーム性のあるプログラムを作るためには、プログラムを起動する度に違 う値を返すメソッドが不可欠である。
rand
乱数を発生する。
rand(自然数)
とすると、0から自然数未満の整数の擬似乱数を発生する。
rand(0)
とすると0から1未満の実数値で擬似乱数を発生する。
ただし、プログラムが発生する乱数の種を初期化するためにsrand
メソッドを呼ぶ必要がある。以下のプログラム断片は、じゃんけんのグーチョキ
パーをランダムに出すものである。
janken = ["グー", "チョキ", "パー"] srand() # 乱数の種を初期化 hand = rand(3) # 3未満の整数(0, 1, 2)を発生 printf "私の手は %s です.\n", janken[hand]
文字列の一部を取り出したり、切り取ったりすることができる。 以下の例ではS を文字列とする。
S[開始位置..終了位置]
文字列Sの開始位置から終了位置
までの文字列を返す。最初の文字の位置を0とする。位置に負の数を指定
すると文字列の終端から数え始める。例えば、-1は最後の文字で、-2は最
後から二番目の文字である。
例:
"abcdefg"[0..2] → "abc" "abcdefg"[4..-1] → "efg" "abcdefg"[-3..-1] → "efg"
終了位置を省略すると、文字列ではなく文字そのもの(文字コード)が 変える。
"abcdefg"[0] → 97 (aの文字コード、つまり ?a)
文字の長さを調べるには、文字列に備わる length
メソッ
ド、またはsize
メソッドを使う。
"abcde".size → 5 "abcde".length → 5
文字を1字ずつ取りだすにはたとえば以下のようにする。
x = "abcdef" i = 0; while i < x.length printf "%c\n", x[i] i+=1 end
sub, sub!, gsub, gsub!
sub
メソッドは、sub(正規表現, 置換後文字列)
の形式で利用して第1引数の「正規表現」にマッチする部分を「置
換後文字列」に置き換える。置き換えは最初にマッチしたものに対してだ
け行なわれる。
例:
"abcdef".sub(/bc/, "FOO") → "aFOOdef" "This is a pen".sub(/is/, "IS") "ThIS is a pen"
sub!
は、sub
と同様だが、元の文字列自
身を直接書き換える。言い換えると、sub
は元の文字列とは
別に新しい文字列を作って返すが、sub!
は新しい文字列を
作らないので、元の文字列は保存されない。
例:
x = "This is a pen" y = x.sub(/is/, "IS") puts x → "This is a pen" puts y → "ThIS is a pen" x = "This is a pen" y = x.sub!(/is/, "IS") puts x → "ThIS is a pen" puts y → "ThIS is a pen"
gsub
は、正規表現にマッチしたものを
全て置き換える。
例:
x = "This is a pen" y = x.gsub(/is/, "IS") puts x → "This is a pen" puts y → "ThIS IS a pen" x = "This is a pen" y = x.gsub!(/is/, "IS") puts x → "ThIS IS a pen" puts y → "ThIS IS a pen"
その他の文字列操作メソッドについては、 Rubyマニュアル - Stringクラスのマニュアルページを参照すること。
Rubyプログラムが動いているときの現在時刻はTime
を
利用して取得する。
Time.now
現在の時刻を返す。秒数でカウントしたい場合は
to_i
メソッドを介して利用すると良い。
たとえば10秒以内になにかの処理をやらせる場合は以下のようにする。
start = Time.now.to_i while true なにかの処理 if Time.now.to_i - start > 10 puts "時間切れです" break end end
配列に複数の値が入っているときの繰り返し処理の書き方にはいくつかある。 以下の処理はどれも同じ働きをする。
sum = 0 x = [10, 20, 15, 44, 8, 3] for i in x do sum += i end
sum = 0 x = [10, 20, 15, 44, 8, 3] x.each do |i| sum += i end
sum = 0 i = 0 x = [10, 20, 15, 44, 8, 3] while i < x.length sum += x[i] i += 1 end
指定した回数繰り返すには以下のどれかを用いると良い。以下の例は どれも10回繰り返す。
i = 0 while i < 10 繰り返し i += 1 end
for i in 1..10 do 繰り返し end
1.upto(10) do |i| 繰り返し end
(1..10).each do |i| 繰り返し end
ファイルの内容を1行ずつ読み込みながら処理を続ける場合の書き方は
いくつかある。以下の例は、どれも "datafile"
というファイル
の中味を1行ずつ読み、それを line
という変数に
代入しつつ処理を繰り返すものである。
open("datafile", "r") do |f| while line=f.gets 繰り返し end end
f = open("datafile", "r") while line=f.gets 繰り返し end f.close
IO.foreach("datafile") do |line| 繰り返し end