Difference between revisions of "32 lines of goodness (日本語)"
(Created page with "{{#set:Name=32 lines of goodness}} {{#set:LOVE Version=0.7.2}} {{#set:Description=うつくしい構文を作るため使用する用途特化言語であり 32 行から成...") |
m |
||
(2 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
− | |||
− | |||
− | |||
− | |||
{{notice|このライブラリは同じ基底クラスからクラスを二つ継承した場合に問題が発生します。詳細はスレッドを確認してください。}} | {{notice|このライブラリは同じ基底クラスからクラスを二つ継承した場合に問題が発生します。詳細はスレッドを確認してください。}} | ||
Line 106: | 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
このライブラリは同じ基底クラスからクラスを二つ継承した場合に問題が発生します。詳細はスレッドを確認してください。 |
Contents
ライブラリについて
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
関連
何か質問があれば出典元の投稿へ投稿してください。