7

lua で特定のタイプ (関数やテーブルなど) を出力すると、次のようにタイプの名前とアドレスが取得されます。

> tab = {}
> print(tab)
table: 0xaddress

__tostring以下のように簡単なクラスを作成しましたが、同様にメソッドをオーバーライドしたいと思います。印刷したいオブジェクトのアドレスを取得するにはどうすればよいですか?

これが私のクラスです。print(pair)印刷したいのですがPair: 0xaddress。明らかにこれは些細な例ですが、概念は役に立ちます:

Pair = {}
Pair.__index = Pair

function Pair.create()
 local p = {}
 setmetatable(p, Pair)
 p.x = 0
 p.y = 0
 return p
end

function Pair:getx()
 return self.x
end

function Pair:gety()
 return self.y
end

function Pair:sety(iny)
 self.y=iny   
end

function Pair:setx(inx)
 self.x=inx
end
4

5 に答える 5

7

これを行うためのばかげた方法は次のとおりです。

Pair.__tostringx = function (p)
    Pair.__tostring = nil    
    local s = "Pair " .. tostring(p)                                                                                                                                                                                                    
    Pair.__tostring = Pair.__tostringx
    return s
end
Pair.__tostring = Pair.__tostringx    

> print(p)
Pair table: 0x7fe469c1f900

内部でさらに文字列操作を実行Pair.__tostringxして、必要な形式を取得できます。たとえば、「テーブル」を削除できます。

于 2012-10-08T19:08:13.373 に答える
1

__tostring()出力table: 0xaddressされる は、実際にはストレート Lua では実装されていないと思います。私はたくさん見回しましたが、私が考えることができる唯一の方法は、あなたが考えていたものとまったく同じではありません. __tostring()デフォルトを使用して通常の文字列を取得し、「テーブル」を取り出して「ペア」に入れるtoString というペア クラスに関数を追加しました。

function Pair:toString()
    normalPrint = tostring(self)
    return ("Pair:" .. normalPrint:sub(7))
end

pair = Pair.create()
print(pair:toString())

次に、Pair:toString() を呼び出して、適切にフォーマットされた出力を取得します。スーパーの __tostring にアクセスするのに苦労するため、__tostring をオーバーライドしている間はこれを行うことはできません。ペアの __tostring を呼び出すと、再帰からスタック オーバーフローが発生します。

于 2012-10-08T18:53:59.163 に答える