3. データ構造

オブジェクト指向言語なので、データの型はクラスとして実現されている。一覧表はマニュアルの 組み込みライブラリ を参照。

3.1. 数値

バージョン2.4.0より前は整数が Fixnum (固定長整数)と Bignum (多倍長整数)に分かれていたが、2.4.0 から Integer (整数)に統一された。整数でない場合は主に Float (浮動小数点数)を使うが Rational (有理数)もある。さらに Complex (複素数)もある。

3.2. 文字列

キーボードから gets で一行入力した場合は、最後に改行が付いていることに注意。改行が不要な場合は chomp で改行を取り除く。

print '単語を入力: '
x = gets.chomp
print "あなたが入力したのは#{x}です。\n"

3.3. シンボル

シンボル

文字列

内部的には番号で管理されるので速い

文字の配列なので遅い

それ以上分解できない

文字単位に分解できる

変更できない

変更できる

:abc.equal?(:abc) は常に真

"abc".equal?("abc") は真とは限らない

シンボルと文字列は相互に変換できるので、どっちを書いてもいい場合も結構ある。

3.4. 配列

要素の型も数も固定されていないし、切ったり繋いだりが自由にできるので、配列と言うよりむしろリストに近い。

[][]= は実はメソッド呼び出し。カッコの中の書き方によって「i番目からj番目まで」とか、「i番目からn個」とかの部分配列も使える。

配列の値を出力すると、ちゃんと要素の列が表示される。

print, p

括弧とコンマを付けて出力

puts

各要素ごとに改行して出力

配列の要素の合計を計算するいろいろなやり方。変数 x に数値の配列が入っているとする。

s = 0
for i in 0 ... x.length
  s += x[i]
end
puts s
s = 0
for y in x
  s += y
end
puts s
s = 0
x.each do |y|  # xの要素がひとつずつyに代入される(来週説明する)
  s += y
end
puts s
puts x.inject(:+)
s = 0
x.length.times do
  s += x.pop   # xの最後の要素を取り出して加える
end
puts s
# xは空になってしまうことに注意

課題4

キーボードから0より大きい数値をいくつか入力していき、0が入力されたらそれまでの数値を逆順に表示するプログラムを作れ。ただし標準ライブラリの reverse を使ってはいけない。(ヒント:配列に要素を追加するには push 、取り出すには pop を使う。)

実行例:

% ruby reverse.rb
数値? 30
数値? 5
数値? 10
数値? 0
10
5
30

【解答例】

3.5. ハッシュ

存在しないキーに対する値を取り出そうとするとデフォルト値(普通は nil )が返ってくる。

dictionary = { 'dog' => '犬', 'cat' => '猫' }

loop do
  print '英語:'
  x = gets.chomp
  if dictionary[x]
    puts "日本語:#{dictionary[x]}"
  else
    puts "わかりません。"
  end
end

存在しないキーを指定して代入をすると、そのキーと値の組が記憶される。

課題5

上のプログラムを拡張し、わからない英語を入力されたら日本語訳を教えてもらって覚えるようにせよ。

実行例:

% ruby dict.rb
英語:sheep
sheepの日本語訳を教えてください:羊
英語:sheep
日本語:羊
英語:

【解答例】

3.6. 正規表現

正規表現と文字列をマッチさせるには /正規表現/ =~ 文字列 とする。正規表現の中に括弧があれば、括弧の部分とマッチした文字列が順に $1, $2, ... という変数に代入される。

print '入力: '
x = gets
if /([0-9a-z]*)@sfc\.keio\.ac\.jp/ =~ x
  puts "ログイン名は#{$1}です。"
else
  puts "メールアドレスらしきものはありません。"
end