2013年9月1日日曜日

Rubyでリングバッファ

超初心者ですので、コードに誤りがあるかもしれないし、もっとRubyっぽく書けるのかもしれませんがとりあえず、意図したことはできていそう。

P_MAX = 10        # 配列の最大個数
class Point
  def initialize
    @x=Array.new(P_MAX)
    @y=Array.new(P_MAX)
    @pointer = -1        # ポインタ
  end

  def x; @x[@pointer]; end   # @xの最新値のゲッターメソッド
  def y; @y[@pointer]; end   # @yの最新値のゲッターメソッド

  # @xの配列ゲッターメソッド
  def getX(n)
    if n >= P_MAX then
      @x[P_MAX-1]
    else
      @x[n]
    end
  end

  # @yの配列ゲッターメソッド
  def getY(n)
    if n >= P_MAX then
      @y[P_MAX-1]
    else
      @y[n]
    end
  end

  # @x,@yの為のセッターメソッド
  def setXY(valueX,valueY)
    @pointer += 1
    if @pointer >= P_MAX then @pointer = 0 end
    @x[@pointer]=valueX
    @y[@pointer]=valueY
    puts "setXY(#{valueX},#{valueY}):@pointer=#{@pointer}"
  end
end

p = Point.new
q = Point.new
puts "p.x = #{p.x} p.y = #{p.y}"
puts "q.x = #{q.x} q.y = #{q.y}"

p.setXY(0,1)
q.setXY(0,-1)
puts 'p.setXY(0,1) q.setXY(0,-1)実施後'
puts "p.x = #{p.x} p.y = #{p.y}"
puts "q.x = #{q.x} q.y = #{q.y}"


p.setXY(1,2)
q.setXY(-1,-2)
puts 'p.setXY(1,2) q.setXY(-1,-2)実施後'
puts "p.x = #{p.x} p.y = #{p.y}"
puts "q.x = #{q.x} q.y = #{q.y}"

n = 0
while n < P_MAX do
  p.setXY(n,n+1)
  q.setXY(-n,-n+1)
  n += 1
end
puts 'p.setXY(n,n+1) q.setXY(-n,-n+1) n=0..9実施後'
puts "p.x = #{p.x} p.y = #{p.y}"
puts "q.x = #{q.x} q.y = #{q.y}"

puts 'getX(n) getY(n) 確認'
n = 0
while n < P_MAX do
  puts "p.getX(#{n}) = #{p.getX(n)}"
  puts "p.getY(#{n}) = #{p.getY(n)}"
  puts "q.getX(#{n}) = #{q.getX(n)}"
  puts "q.getY(#{n}) = #{q.getY(n)}"
  n += 1
end