_
で書き始める$
で始まる変数はグローバル変数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字 |