九九スクリプト書いてみたよ

http://d.hatena.ne.jp/hrkt0115311/20080805/1217928310
クラスにしないものとクラスにしたものの2つを書いてみました。
独学なので他の人がどこで詰まるとか良く分かりません><。なのでうまく説明できないです><分からないところがあったらコメントしてください><

普通に書くならこんな感じかなー。

 def make_list(n)
   (1..n).map{|x| (1..n).map{ |y| x * y}}
 end

 def output(list, padding="\t")
   list.each{|e| puts e.join(padding)}
 end
# output(make_list(9)) #2つめの引数を省略すると"\t"が渡される

クラスにするなら

class Qq
  def initialize n
    @size = n
  end

  def make_list
    @mem = (1..@size).map{|x| (1..@size).map{ |y| x * y}}
  end

  def output
    @mem ||= make_list
    @mem.each{ |line| puts line.join("\t")}
  end

  def output2
    #blockを指定できるようにしてみる
    @mem ||= make_list
    if block_given?
      @mem.each{|line| puts yield(line)}
    else
      @mem.each{ |line| puts line.join("\t")}
    end
  end
end

呼び出し

qq = Qq.new(6)
qq.output
qq.output2{|line| %Q{#{line.first} | #{line[1..-1].join(", ")}}}
qq.output2{|l| l.map{|e| "( #{e} )"}.join(" ")}

#1.9ならrequireしなくてもいい
require 'enumerator'
qq.output2{|l| l.to_enum(:each_slice, 3).map{|e| %Q{( #{e.join(" ")} )}}.join(" ")}

output2はブロックを受け取るので、いろいろな形式で出力できます。

実行結果

1	2	3	4	5	6
2	4	6	8	10	12
3	6	9	12	15	18
4	8	12	16	20	24
5	10	15	20	25	30
6	12	18	24	30	36
1 | 2, 3, 4, 5, 6
2 | 4, 6, 8, 10, 12
3 | 6, 9, 12, 15, 18
4 | 8, 12, 16, 20, 24
5 | 10, 15, 20, 25, 30
6 | 12, 18, 24, 30, 36
( 1 ) ( 2 ) ( 3 ) ( 4 ) ( 5 ) ( 6 )
( 2 ) ( 4 ) ( 6 ) ( 8 ) ( 10 ) ( 12 )
( 3 ) ( 6 ) ( 9 ) ( 12 ) ( 15 ) ( 18 )
( 4 ) ( 8 ) ( 12 ) ( 16 ) ( 20 ) ( 24 )
( 5 ) ( 10 ) ( 15 ) ( 20 ) ( 25 ) ( 30 )
( 6 ) ( 12 ) ( 18 ) ( 24 ) ( 30 ) ( 36 )
( 1 2 3 ) ( 4 5 6 )
( 2 4 6 ) ( 8 10 12 )
( 3 6 9 ) ( 12 15 18 )
( 4 8 12 ) ( 16 20 24 )
( 5 10 15 ) ( 20 25 30 )
( 6 12 18 ) ( 24 30 36 )