Difference between revisions of "32 lines of goodness (日本語)"

m
m
 
(One intermediate revision by the same user not shown)
Line 1: Line 1:
{{#set:Name=32 lines of goodness}}
 
{{#set:LOVE Version=0.7.2}}
 
{{#set:Description=うつくしい構文を作るため使用する用途に特化した言語であり 32 行から成る優秀な小型のオブジェクト指向ライブラリ。
 
{{#set:Keyword=Class}}
 
 
 
{{notice|このライブラリは同じ基底クラスからクラスを二つ継承した場合に問題が発生します。詳細はスレッドを確認してください。}}
 
{{notice|このライブラリは同じ基底クラスからクラスを二つ継承した場合に問題が発生します。詳細はスレッドを確認してください。}}
  
Line 107: Line 102:
 
end
 
end
 
</source>
 
</source>
 
  
 
== 関連 ==
 
== 関連 ==
 
何か質問があれば[http://love2d.org/forums/viewtopic.php?f=5&t=3344 出典元の投稿]へ投稿してください。
 
何か質問があれば[http://love2d.org/forums/viewtopic.php?f=5&t=3344 出典元の投稿]へ投稿してください。
 +
 +
{{#set:Name=32 lines of goodness}}
 +
{{#set:LOVE Version=0.7.2}}
 +
{{#set:Description=うつくしい構文の作成用途に特化した言語であり 32 行から成る優秀な小型のオブジェクト指向ライブラリ。}}
 +
{{#set:Keyword=Class}}
 
[[Category:Libraries (日本語)]]
 
[[Category:Libraries (日本語)]]
 +
== そのほかの言語 ==
 +
{{i18n (日本語)|32 lines of goodness}}

Latest revision as of 14:50, 15 December 2019

O.png このライブラリは同じ基底クラスからクラスを二つ継承した場合に問題が発生します。詳細はスレッドを確認してください。  


ライブラリについて

local mt_class = {}

function mt_class:extends(parent)
   self.super = parent
   setmetatable(mt_class, {__index = parent})
   parent.__members__ = parent.__members__ or {}
   return self
end

local function define(class, members)
   class.__members__ = class.__members__ or {}
   for k, v in pairs(members) do
      class.__members__[k] = v
   end
   function class:new(...)
      local newvalue = {}
      for k, v in pairs(class.__members__) do
         newvalue[k] = v
      end
      setmetatable(newvalue, {__index = class})
      if newvalue.__init then
         newvalue:__init(...)
      end
      return newvalue
   end
end

function class(name)
    local newclass = {}
   _G[name] = newclass
   return setmetatable(newclass, {__index = mt_class, __call = define})
end

そしてすべてがここにある! なんと 32 行です!

使用方法

選択したファイル (恐らく "32log.lua") へ上記のライブラリを打ち込み、あなたのコードにて require 関数を使用してインクルードしてください。

基本的な構文は下記の通りです:

class "ClassName" : extends(BaseClassName) {
    memberName = nonNilValue;
}

いったんクラスが作成されたならば下記のようにクラスの新しいインスタンスを作成することができます:

local myInstance = ClassName:new()

__init という名称のメソッドを作成すると、それを new によりコンストラクタとして使用することができます:

class "Vector" {
    x = 0;
    y = 0;
    z = 0;
}
function Vector:__init(x, y, z)
    self.x = x
    self.y = y
    self.z = z
end
function Vector:print()
    print(self.x, self.y, self.z)
end
local vec = Vector:new(1, 0.5, 0.25)
vec:print()

定義内において任意の値をメンバへ設定すると、それはメンバに対する標準値の振る舞いをします。それらは常に値により複製されますがテーブルは少し技巧的な場合は、この動作は数値や文字列の値に相当します:

class "Foo" {
   bar = {};
}
local foo = Foo:new()
foo.bar["foobar"] = 10;
local foo2 = Foo:new()
print(foo2.bar["foobar"])

クラスは親の標準メンバとメタ・メソッドを継承します。super (上位) メンバを使用して派生したクラスにてオーバーロードをすることで親のメソッドを呼び出すこともできます:

class "Base" {}
function Base:foobar()
    print("foo")
end
class "Derived" : extends(Base) {} 
function Derived:foobar()
   self.super.foobar(self)
   print("bar")
end

関連

何か質問があれば出典元の投稿へ投稿してください。

そのほかの言語