_ で書き始める$ で始まる変数はグローバル変数if - 分岐
if 条件1 then ブロック1 elsif 条件2 then ブロック2 : : else ブロックelse end
条件1 が成り立つときは ブロック1 を, 条件2 が成り立つときは ブロック2 を,…, いずれでもないときは ブロックelse を, 評価する。
while - 条件が成り立つ間の繰り返し
while 条件 ブロック end
条件 が真である間 ブロック を繰り返す。
case - 選択
case 値 when 値1[,値1b,…] ブロック1 when 値2 ブロック2 else ブロックelse end
case 直後に書いた 値 を後続する
when の後の値と比較し,一致したらそのすぐ後の
ブロックを評価する。どの when の値にも一致しなかった
ときは else 後のブロックに進む。
break
while などの構文を抜けて次に進む。
next
while などの繰り返し構文の次の回に進む。
条件の評価からやりなおす。
redo
while などの繰り返し構文のブロック先頭に進む。
条件の評価はしない。
| 比較演算子 | 意味 |
|---|---|
| == | 左辺と右辺が等しいか |
| < | 左辺が右辺より小さいか |
| <= | 左辺が右辺以下か |
| > | 左辺が右辺より大きいか |
| >= | 左辺が右辺以上か |
| && | 「かつ」 |
| || | 「または」 |
| ! | 否定 |
| not | 否定 |
条件が成り立つ場合は,真を表す true が,
成り立たない場合は偽を表す false を返す。
| 演算子 | 意味 |
|---|---|
| + | 加算 |
| * | 乗算 |
| - | 減算 |
| / | 除算 |
| % | 剰余 |
| ** | 巾乗(べき乗) |
| = | 通常代入 x=5 |
| += | 加算代入 x+=5 でxが5増える |
| *= | 乗算代入 x*=5 でxが5倍になる |
| -= | 減算代入 x-=5 でxが5減る |
| /= | 除算代入 x/=5 でxが1/5になる |
| %= | 剰余代入 x%=5 は x = x%5 と同じ |
| **= | 巾乗代入 x**=5 は x=x**5と同じ |
メソッド定義は以下の形式で行なう。
def メソッド(引数リスト) 定義本体 end
の形式で メソッド を定義する。
def foo(x, y) end
とすると,2つの引数を取るメソッド foo が定義される。
x と y は仮引数と呼び,
呼ぶときに渡された2つの値がその順番で代入される。定義した
foo メソッドを呼ぶときは,
foo(a, b)
のようにする。メソッドの引数を省略可能とすることもできる。
def bar(x, y="foo") end
とすると第2引数を省略可能になる。省略時の値が "foo"
となる。
times - 回数指定の繰り返し
N.times do 繰り返し本体 end
繰り返し本体 を N 回繰り返す。
upto と downto - 数えながらの繰り返し
M.upto(N) do |変数| 繰り返し本体 end
整数 M から N まで(M < N)を 変数 に代入しながらブロックを繰り返す。
1.upto(10) do |x|
printf("%d, ", x)
end
は1〜10までの整数を全てカンマ区切りで出力する。
downto は,upto の逆で
大きい数から小さい数に向かって繰り返しを行なう。
step - 数えながらの繰り返し
B.step(G, S) do |変数| 繰り返し本体 end
初期値 B から始めて,Sずつ 数を増やしながら G まで変化する数を 変数 に代入しながら繰り返しを行なう。 以下に例を示す。
s = 0
1.step(99, 2) do |n|
s += n
end
printf("1〜99の合計は %d です。\n", s)
for - 配列要素すべてに対する繰り返し
for 変数 in 配列 do 繰り返し本体 end
配列 の要素を1つずつ取り出し順次 変数 に代入してブロックを繰り返す。
each - 配列要素すべてに対する繰り返し
配列.each do |変数| 繰り返し本体 end
for と同じ働きを持つ。
値の1次元的な集合を表すのが配列。先頭要素は添字0でアクセスする。 Rubyでは配列の要素にどんな種類の値が入っても構わない。
[1, nil, "foo", [2, true], 3.14]
という配列も可能で,これは第0要素から順に
整数の1,nil,文字列の "foo",
配列の [2, true],浮動小数点数の3.14が格納されている。
配列に備わっている代表的なメソッドには以下のものがある。
length | 要素数を返す |
sort | 並べ換え |
reverse | 逆順化 |
uniq | 重複要素の削除 |
delete(val) | 指定要素の削除 |
shift | 先頭要素を取り出して削除 |
unshift(val) | 要素を配列の先頭に追加 |
<< val | 要素を配列の末尾に追加 |
index(val) | 指定要素の位置を返す |
配列要素を一つずつ取り出して繰り返す処理は以下のように書く。
# eachを使う場合 array.each do |val| # valに要素が順に入る end # forを使う場合 for val in array do # valに要素が順に入る end
配列の添字を任意の値にできるものがハッシュである。
ハッシュ値のリテラル表記はブレース(中括弧; {})を用いる。
v = {key1 => value1,
key2 => value2,
key3 => value3, ...}
これは以下のように代入するのと同じ。
v = Hash.new v[key1] = value1 v[key2] = value2 v[key3] = value3 :
ハッシュの各要素にアクセスするときの記法は配列と同じく
ブラケット(大括弧; [ ])を用いる。
x = v[key]
ハッシュに備わっている代表的なメソッドには以下のものがある。
length | キーと値のペアの個数を返す |
keys | キーのみからなる配列を返す |
values | 値のみからなる配列を返す |
has_key?(key) |
keyと一致するキーが存在するか(trueかfalseが返る) |
delete(key) |
keyと一致するキーと対応する値を削除する |
ハッシュのキーと値を一組ずつ取り出して繰り返す処理は以下のように書く。
# eachを使う場合 hash.each do |key, val| # keyにキー,valに値が順に入る end # forを使う場合 for key, val in hash do # keyにキー,valに値が順に入る end
ハッシュのキーに存在しないものを指定したときは通常nil
を返す。
hash["detarame"] # 存在しないキーだとする nil
存在しないキーに対する値は default= メソッドで変更できる。
hash.default = "not found" hash["detarame"] not found
文字列リテラルはダブルクォート,またはシングルクォートで括って表す。
# いずれも同じ foo という文字列 "foo" 'foo'
ダブルクォートの中では #{ }
による値の展開が行なわれる。
x = 5
"xの値は#{x}です"
xの値は5です。
'xの値は#{x}です'
xの値は#{x}です。
文字列に対する操作の代表的なメソッドを示す。[ ]
内の添字は0から始まる。添字に負の整数を与えると末尾から数える。
str.length | 文字列の長さを返す |
str1+str2 |
文字列どうしの結合 |
str*N |
文字列のN回繰り返し |
str[N] |
文字列のN文字目の取り出し(str[0]が先頭) |
str[B,L] |
B文字目からL文字分の部分文字列を返す |
str[B..E] |
B文字目からE文字目までの部分文字列を返す |
Rubyプログラムにデータを与えるには,
./program.rb datafile.txt
./program.rb (その1) データ1 データ2 : [C-d] ./program.rb < datafile.txt (その2) cat datafile.txt | ./program.rb (その3)
の方法がある。
1と2はgetsのみで,
while line=gets 〜処理〜 end
という構成で,3はopenメソッドを用い
open(file, "r") do |handle|
while line=handle.gets
〜処理〜
end
end
という構成で作成する。
データをファイルに書き出すにはopenメソッドのモード指定に
"w" を指定する。
open(outfile, "w") do |handle| handle.print(....) end
以下のプログラムは output.txt ファイルに,1から10までの数字を書き出す。
open("output.txt", "w") do |w|
1.upto(10) do |x|
w.printf("%d\n", x)
end
end
openメソッドで指定できるモードを以下に示す。このモードは Cに近いプログラミング言語ではほぼ共通である。
"r" | 読み込み用で開く。 |
"r+" |
読み書き両用で開く。読み込みはファイル先頭から行なわれる。 |
"w" |
書き込み用で開く。同名ファイルがあったら空にしてから書き込む。 |
"w+" |
読み書き両用で開く。既存のファイルがあったら空にしてから書き込む。 |
"a" |
書き込み用で開く。既存のファイルがあったら末尾に追加して書き込む。 |
"a+" |
読み書き両用で開く。既存のファイルがあったら末尾に追加して書き込む。 |
正規表現は / / で括る。
if /正規表現/ =~ 文字列 then 〜文字列がマッチする場合の処理〜 end
. (ピリオド) | 任意の1字 |
[文字クラス] | 選択(下記参照) |
* | 直前の正規表現の0回以上の繰り返し |
+ | 直前の正規表現の1回以上の繰り返し |
? | 直前の正規表現の0か1の繰り返し |
{N} | 直前の正規表現の N回の繰り返し |
{N,} | 直前の正規表現の N回以上の繰り返し |
{M,N} | 直前の正規表現の M〜N回の繰り返し |
^ | 行頭 |
$ | 行末 |
\w | 英数字 [0-9A-Za-z_] |
\W | 非英数字(\wの逆) |
\s | 空白文字 [ \t\n\r\f] |
\S | 非空白文字(\sの逆) |
\d | 数字 [0-9] |
\D | 非数字(\dの逆) |
\b | 単語境界 |
\B | 非単語境界 |
文字クラスの利用例をいくつか示す。
[abc123] | a, b, c, 1, 2, 3のどれか1字 |
[a-z] | a〜zのどれか1字 |
[^a-z] | a〜z以外のどれか1字 |
[-0-9] | ハイフンまたは0〜9のどれか1字 |
[\[\]] | [ または ] のどちらか1字 |