エンジニアのソフトウェア的愛情

または私は如何にして心配するのを止めてプログラムを・愛する・ようになったか

Luaでオブジェクト指向

-- クラスの定義

Point = {}
Point.__index = Point; -- ここがミソ、その1

function Point:new(x, y)
  local new_instance =
  {
    x_ = x or 0,
    y_ = y or 0
  }
  setmetatable(new_instance, self) -- ここがミソ、その2
  return new_instance
end

function Point:__unm()
  return Point:new(- self.x_, - self.y_)
end

function Point:__add(other)
  return Point:new(self.x_ + other.x_, self.y_ + other.y_)
end

function Point:__sub(other)
  return self + (- other)
end

function Point:__mul(n)
  return Point.new(self.x_ * n, self.y_ * n)
end

function Point:__div(n)
  return Point.new(self.x_ / n, self.y_ / n)
end

function Point:__tostring()
  return "(" .. self.x_ .. ", " .. self.y_ .. ")"
end

function Point:set(x, y)
  self.x_ = x
  self.y_ = y
end

function Point:abs()
  return math.sqrt(self.x_ ^ 2 + self.y_ ^ 2)
end

function Point:distance(other)
  return (self - other):abs()
end

local p1 = Point:new() -- インスタンス作成
print("p1 = ", p1)
p1:set(10, 20)
print("p1 = ", p1)
print("-p1 = ", -p1)
print("p1:abs() = ", p1:abs())

local p2 = Point:new(3, 4) -- インスタンス作成
print("p2 = ", p2)
print("p2:abs() = ", p2:abs())

print("p1 + p2 = ", p1 + p2)
print("p1 - p2 = ", p1 - p2)
print("p1:distance(p2) = ", p1:distance(p2))

p1:set(3, 0)
p2:set(0, 4)
print("p1 = ", p1)
print("p2 = ", p2)
print("p1:distance(p2) = ", p1:distance(p2))


実行結果。

 p1 =    (0, 0)
 p1 =    (10, 20)
 -p1 =   (-10, -20)
 p1:abs() =      22.360679774998
 p2 =    (3, 4)
 p2:abs() =      5
 p1 + p2 =       (13, 24)
 p1 - p2 =       (7, 16)
 p1:distance(p2) =       17.464249196573
 p1 =    (3, 0)
 p2 =    (0, 4)
 p1:distance(p2) =       5


う〜ん。やっぱり「Programming in Lua プログラミング言語Lua公式解説書」買うべきなのかなぁ。

Programming in Lua プログラミング言語Lua公式解説書

Programming in Lua プログラミング言語Lua公式解説書