Ruby体験記9 〜ヘルプ、クラス、添付ライブラリ、メソッドチェイン、2次元配列、ブロックの簡易記法、エスケープシーケンス、降番順ループ、
どうも。三十路です。
本日でこの本での勉強も最後となりました。
プログラミング学習シリーズ Ruby 1 はじめてのプログラミング
- 作者: arton,宇野るいも
- 出版社/メーカー: 翔泳社
- 発売日: 2009/01/29
- メディア: 大型本
- 購入: 5人 クリック: 95回
- この商品を含むブログ (30件) を見る
つーても。シリーズものなのであと2冊あるんですけどね・・・。
いままでの内容、変数、関数、条件分岐、ループの手法を組み合わせたものは手続き型プログラミングというらしい。
名前なんぞどうでもいい気もするが一応覚えておく。
Rubyはオブジェクト指向プログラミング言語なのでこれからはそれを勉強。
ってことで次の本にうつる。
最後の8章はファイルの扱いばかりなのでGoogle App Engineでは扱えないから読んでもいみなしぞうってことで飛ばす。
そんなわけで2巻。
Ruby 2 さまざまなデータとアルゴリズム (CD-ROM付) (プログラミング学習シリーズ)
- 作者: arton,宇野るいも
- 出版社/メーカー: 翔泳社
- 発売日: 2009/02/13
- メディア: 大型本
- 購入: 1人 クリック: 48回
- この商品を含むブログ (21件) を見る
へるぷ?とクラスと添付ライブラリ
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
そんな日。