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)指定要素の位置を返す

ハッシュ

配列の添字を任意の値にできるものがハッシュである。 ハッシュ値のリテラル表記はブレース(中括弧; {})を用いる。

{key1, value1,
 key2, value2,
 key3, value3, ...}

ハッシュの各要素にアクセスするときの記法は配列と同じく ブラケット(大括弧; [ ])を用いる。

x[v] = gets.chomp

は、ハッシュ xv というキーに 標準入力から読んで改行を取ったものを結び付ける。

ファイル操作

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 readbuffer=gets
  〜処理〜
end

という構成で,3はopenメソッドを用い

open(file, "r") do |handle|
  while readbuffer=handle.gets
    〜処理〜
  end
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非単語境界
Rubyマニュアル 正規表現 も参照。

本日の目次

yuuji@e.koeki-u.ac.jp