Ruby体験記9 〜ヘルプ、クラス、添付ライブラリ、メソッドチェイン、2次元配列、ブロックの簡易記法、エスケープシーケンス、降番順ループ、

どうも。三十路です。

本日でこの本での勉強も最後となりました。

プログラミング学習シリーズ Ruby 1 はじめてのプログラミング

プログラミング学習シリーズ Ruby 1 はじめてのプログラミング

つーても。シリーズものなのであと2冊あるんですけどね・・・。

いままでの内容、変数、関数、条件分岐、ループの手法を組み合わせたものは手続き型プログラミングというらしい。
名前なんぞどうでもいい気もするが一応覚えておく。
Rubyオブジェクト指向プログラミング言語なのでこれからはそれを勉強。

ってことで次の本にうつる。
最後の8章はファイルの扱いばかりなのでGoogle App Engineでは扱えないから読んでもいみなしぞうってことで飛ばす。

そんなわけで2巻。

Ruby 2 さまざまなデータとアルゴリズム (CD-ROM付) (プログラミング学習シリーズ)

Ruby 2 さまざまなデータとアルゴリズム (CD-ROM付) (プログラミング学習シリーズ)

へるぷ?とクラスと添付ライブラリ

Rubyには組み込みクラスと呼ばれる実行プログラム内に組み込まれたクラス群と、多数の独立したクラスをまとめた添付ライブラリというものがある。
これらを見るためにリファレンスマニュアルがある。以下のURLからダウンロードできる模様。
http://redmine.ruby-lang.org/wiki/rurema

メソッドチェイン

メソッド呼び出しを行いその戻り値がオブジェクトの場合、その戻り値のオブジェクトのメソッドを呼び出すことをメソッドチェインという。

2次元配列

配列の要素に配列が入れられたものを2次元配列という。さらに3次元以上つくることができこれらを総称して多次元配列という。

str = "あ,い,う,え,お"
sentences << str.split(",") #カンマ区で区切られたところで区切って配列を作り、その配列を配列の最後に追加する

配列の長さはsizeで得られる
sentences.size

ブロックの簡易記法

a = Array.new(10) do |i|
  Array.new(10, 0)
end
||>
を以下のように1行で記述可能
>|ruby|
a = Array.new(10) {|i| Array.new(10, 0)}

エスケープシーケンス

「\」はエスケープシーケンスの開始を示す文字。エスケープシーケンスとは現在の状態を一時的に離れて別の一連の処理を実行する制御を指す。
http://wisdom.sakura.ne.jp/programming/c/Cdata1.html

降番順のループ

Integer#downtoメソッドを使う。
以下の例はオブジェクトの値から引数(downtoメソッドの)で指定した値までの書く整数をブロック変数に入れながらブロックを実行する。1ずつ減らす。
3,2,1,0

3.downto(0) do |i|
end

その反対に以下の例は、オブジェクトの値から引数でしたいした値までの各整数をブロック変数に入れながらブロックを実行する。1ずつ増やす。
3,4,5,6

3.upto(6) do |i|
end

小問題5(P45)

1)

BITMAPFILEHEADER = "a2VIV"
BITMAPINFOHEADER = "VVVvvVVVVVV"
WIDTH = 640
HEIGHT = 480
FILEHEADER_LEN = 14
INFOHEADER_LEN = 40
COLOR_USED = 2
COLORTBL_LEN = 4 * COLOR_USED
HEADERS_LEN = INFOHEADER_LEN + FILEHEADER_LEN + COLORTBL_LEN

pas = Array.new(HEIGHT) {|i| Array.new(WIDTH, 0)}
pas[0][WIDTH / 2] = 1
for i in (1..HEIGHT - 1)
  for j in (1..WIDTH - 2)
    pas[i][j] = pas[i - 1][j - 1] + pas[i - 1][j + 1]
  end
end

File.open("pascal_rev.bmp", "wb") do |file|
  file.write(["BM", HEADERS_LEN + WIDTH * HEIGHT, 0, HEADERS_LEN].pack(BITMAPFILEHEADER))
  file.write([INFOHEADER_LEN, WIDTH, HEIGHT, 1, 8, 0, 0,
               0, 0, COLOR_USED, COLOR_USED].pack(BITMAPINFOHEADER))
  file.write("\xff\xff\xff\0")
  file.write("\0\0\0\0")
  (HEIGHT - 1).downto(0) do |y|
    0.upto(WIDTH - 1) do |x|
      if pas[y][x] % 2 == 0
        file.write("\x01")
      else
        file.write("\0")
      end
    end
  end
end

2)

BITMAPFILEHEADER = "a2VIV"
BITMAPINFOHEADER = "VVVvvVVVVVV"
WIDTH = 640
HEIGHT = 480
FILEHEADER_LEN = 14
INFOHEADER_LEN = 40
COLOR_USED = 2
COLORTBL_LEN = 4 * COLOR_USED
HEADERS_LEN = INFOHEADER_LEN + FILEHEADER_LEN + COLORTBL_LEN

pas = Array.new(HEIGHT) {|i| Array.new(WIDTH, 0)}
pas[0][WIDTH / 2] = 1
for i in (1..HEIGHT - 1)
  for j in (1..WIDTH - 2)
    pas[i][j] = pas[i - 1][j - 1] + pas[i - 1][j + 1]
  end
end

def bmpfile_write(pas, filename, color1, color2)
  File.open(filename, "wb") do |file|
    file.write(["BM", HEADERS_LEN + WIDTH * HEIGHT, 0, HEADERS_LEN].pack(BITMAPFILEHEADER))
    file.write([INFOHEADER_LEN, WIDTH, HEIGHT, 1, 8, 0, 0,
                 0, 0, COLOR_USED, COLOR_USED].pack(BITMAPINFOHEADER))
    file.write(color1)
    file.write(color2)
    (HEIGHT - 1).downto(0) do |y|
      0.upto(WIDTH - 1) do |x|
        if pas[y][x] % 2 == 0
          file.write("\0")
        else
          file.write("\x01")
        end
      end
    end
  end
end
bmpfile_write pas, "pascal_br.bmp", "\0\0\0\0", "\xff\0\0\0"
bmpfile_write pas, "pascal_wr.bmp", "\xff\xff\xff\0", "\0\0\xff\0"

3)

BITMAPFILEHEADER = "a2VIV"
BITMAPINFOHEADER = "VVVvvVVVVVV"
WIDTH = 640
HEIGHT = 480
FILEHEADER_LEN = 14
INFOHEADER_LEN = 40
COLOR_USED = 2
COLORTBL_LEN = 4 * COLOR_USED
HEADERS_LEN = INFOHEADER_LEN + FILEHEADER_LEN + COLORTBL_LEN

pas = Array.new(HEIGHT) {|i| Array.new(WIDTH, 0)}
pas[0][WIDTH / 2] = 1
for i in (1..HEIGHT - 1)
  for j in (1..WIDTH - 2)
    pas[i][j] = pas[i - 1][j - 1] + pas[i - 1][j + 1]
  end
end

File.open("pascal_mod5.bmp", "wb") do |file|
  file.write(["BM", HEADERS_LEN + WIDTH * HEIGHT, 0, HEADERS_LEN].pack(BITMAPFILEHEADER))
  file.write([INFOHEADER_LEN, WIDTH, HEIGHT, 1, 8, 0, 0,
               0, 0, COLOR_USED, COLOR_USED].pack(BITMAPINFOHEADER))
  file.write("\xff\xff\xff\0")
  file.write("\0\0\0\0")
  (HEIGHT - 1).downto(0) do |y|
    0.upto(WIDTH - 1) do |x|
      if pas[y][x] % 5 == 0
        file.write("\0")
      else
        file.write("\x01")
      end
    end
  end
end

そんな日。