********** データ構造 ********** オブジェクト指向言語なので、データの型はクラスとして実現されている。一覧表はマニュアルの `組み込みライブラリ `_ を参照。 数値 ==== バージョン2.4.0より前は整数が ``Fixnum`` (固定長整数)と ``Bignum`` (多倍長整数)に分かれていたが、2.4.0 から ``Integer`` (整数)に統一された。整数でない場合は主に ``Float`` (浮動小数点数)を使うが ``Rational`` (有理数)もある。さらに ``Complex`` (複素数)もある。 文字列 ====== * `class String `_ * `文字列リテラル `_ * `ヒアドキュメント `_ * `多言語化 `_ キーボードから ``gets`` で一行入力した場合は、最後に改行が付いていることに注意。改行が不要な場合は ``chomp`` で改行を取り除く。 .. code-block:: ruby print '単語を入力: ' x = gets.chomp print "あなたが入力したのは#{x}です。\n" シンボル ======== * `class Symbol `_ .. list-table:: :header-rows: 1 * - シンボル - 文字列 * - 内部的には番号で管理されるので速い - 文字の配列なので遅い * - それ以上分解できない - 文字単位に分解できる * - 変更できない - 変更できる * - ``:abc.equal?(:abc)`` は常に真 - ``"abc".equal?("abc")`` は真とは限らない シンボルと文字列は相互に変換できるので、どっちを書いてもいい場合も結構ある。 配列 ==== * `class Array `_ 要素の型も数も固定されていないし、切ったり繋いだりが自由にできるので、配列と言うよりむしろリストに近い。 ``[]`` と ``[]=`` は実はメソッド呼び出し。カッコの中の書き方によって「i番目からj番目まで」とか、「i番目からn個」とかの部分配列も使える。 配列の値を出力すると、ちゃんと要素の列が表示される。 .. list-table:: * - ``print``, ``p`` - 括弧とコンマを付けて出力 * - ``puts`` - 各要素ごとに改行して出力 配列の要素の合計を計算するいろいろなやり方。変数 ``x`` に数値の配列が入っているとする。 .. code-block:: ruby s = 0 for i in 0 ... x.length s += x[i] end puts s .. code-block:: ruby s = 0 for y in x s += y end puts s .. code-block:: ruby s = 0 x.each do |y| # xの要素がひとつずつyに代入される(来週説明する) s += y end puts s .. code-block:: ruby puts x.inject(:+) .. code-block:: ruby s = 0 x.length.times do s += x.pop # xの最後の要素を取り出して加える end puts s # xは空になってしまうことに注意 .. admonition:: 課題4 :class: exercise キーボードから0より大きい数値をいくつか入力していき、0が入力されたらそれまでの数値を逆順に表示するプログラムを作れ。ただし標準ライブラリの ``reverse`` を使ってはいけない。(ヒント:配列に要素を追加するには `push `_ 、取り出すには `pop `_ を使う。) 実行例:: % ruby reverse.rb 数値? 30 数値? 5 数値? 10 数値? 0 10 5 30 :ref:`【解答例】 ` ハッシュ ======== * `class Hash `_ 存在しないキーに対する値を取り出そうとするとデフォルト値(普通は ``nil`` )が返ってくる。 .. code-block:: ruby dictionary = { 'dog' => '犬', 'cat' => '猫' } loop do print '英語:' x = gets.chomp if dictionary[x] puts "日本語:#{dictionary[x]}" else puts "わかりません。" end end 存在しないキーを指定して代入をすると、そのキーと値の組が記憶される。 .. admonition:: 課題5 :class: exercise 上のプログラムを拡張し、わからない英語を入力されたら日本語訳を教えてもらって覚えるようにせよ。 実行例:: % ruby dict.rb 英語:sheep sheepの日本語訳を教えてください:羊 英語:sheep 日本語:羊 英語: :ref:`【解答例】 ` 正規表現 ======== * `class Regexp `_ * `正規表現 `_ * `手を動かしながら覚える正規表現<基礎入門編> `_ 正規表現と文字列をマッチさせるには ``/正規表現/ =~ 文字列`` とする。正規表現の中に括弧があれば、括弧の部分とマッチした文字列が順に ``$1``, ``$2``, ... という変数に代入される。 .. code-block:: ruby print '入力: ' x = gets if /([0-9a-z]*)@sfc\.keio\.ac\.jp/ =~ x puts "ログイン名は#{$1}です。" else puts "メールアドレスらしきものはありません。" end