Ruby文法のおさらい

プログラム全体

変数

制御構造

条件式

比較演算子 意味
== 左辺と右辺が等しいか
< 左辺が右辺より小さいか
<= 左辺が右辺以下か
> 左辺が右辺より大きいか
>= 左辺が右辺以上か
&& 「かつ」
|| 「または」
! 否定
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 が定義される。 xy仮引数と呼び, 呼ぶときに渡された2つの値がその順番で代入される。定義した foo メソッドを呼ぶときは,

foo(a, b)

のようにする。メソッドの引数を省略可能とすることもできる。

def bar(x, y="foo")
end

とすると第2引数を省略可能になる。省略時の値が "foo" となる。

繰り返し

数を基準とした繰り返し

配列

値の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プログラムにデータを与えるには,

  1. getsでコマンドライン引数のファイルを読ませる
    ./program.rb datafile.txt
    
  2. getsで標準入力を読ませる
    ./program.rb                     (その1)
    データ1
    データ2
       :
    [C-d]
    ./program.rb < datafile.txt      (その2)
    cat datafile.txt | ./program.rb  (その3)
    
  3. openで特定のファイルを読ませる

の方法がある。

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メソッドのモード

openメソッドで指定できるモードを以下に示す。このモードは Cに近いプログラミング言語ではほぼ共通である。

"r"読み込み用で開く。
"r+" 読み書き両用で開く。読み込みはファイル先頭から行なわれる。
"w" 書き込み用で開く。同名ファイルがあったら空にしてから書き込む。
"w+" 読み書き両用で開く。既存のファイルがあったら空にしてから書き込む。
"a" 書き込み用で開く。既存のファイルがあったら末尾に追加して書き込む。
"a+" 読み書き両用で開く。既存のファイルがあったら末尾に追加して書き込む。

正規表現

正規表現は / / で括る。

if /正規表現/ =~ 文字列 then
  〜文字列がマッチする場合の処理〜
end
. (ピリオド)任意の1字
[文字クラス]選択(下記参照)
*直前の正規表現の0回以上の繰り返し
+直前の正規表現の1回以上の繰り返し
?直前の正規表現の0か1の繰り返し
{N}直前の正規表現の N回の繰り返し
{N,}直前の正規表現の N回以上の繰り返し
{M,N}直前の正規表現の MN回の繰り返し
^行頭
$行末
\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字
Rubyマニュアル 正規表現 も参照。

本日の目次

yuuji@e.koeki-u.ac.jp