2012-10-08 35 views
6

Khi bạn in một số loại trong lua (ví dụ như chức năng và bảng), bạn sẽ có được tên của các loại và một địa chỉ, như sau:có được địa chỉ của một đối tượng lua

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

tôi đã tạo ra một lớp đơn giản như dưới đây, và tôi muốn ghi đè lên phương thức __tostring tương tự. Làm cách nào để lấy địa chỉ của đối tượng mà tôi muốn in?

Đây là lớp học của tôi. Tôi muốn print(pair) để in ra Pair: 0xaddress. Rõ ràng đây là một ví dụ nhỏ, nhưng khái niệm này rất hữu ích:

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 

Trả lời

7

Đây là một cách hokey để làm điều đó:

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 

Bạn có thể làm chuỗi thao tác nhiều bên Pair.__tostringx để có được những định dạng mà bạn muốn, ví dụ: để loại bỏ "bảng".

+1

+1 vì tính năng này hoạt động, nhưng sẽ rất tuyệt nếu Lua có chức năng 'rawtostring' để loại hack này không cần thiết. – finnw

+0

Đây không phải là chủ đề an toàn, phải không? – Llamageddon

1

Tôi nghĩ rằng __tostring() rằng in table: 0xaddress không thực sự thực hiện trong Lua thẳng. Tôi nhìn xung quanh một bó, nhưng cách duy nhất tôi có thể nghĩ để làm điều đó không phải là chính xác những gì bạn đang suy nghĩ. Tôi đã thêm một hàm vào lớp Pair được gọi là toString sử dụng mặc định __tostring() để lấy chuỗi bình thường, sau đó lấy ra "bảng" và đặt vào "Cặp".

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

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

Sau đó, bạn gọi Pair: toString() để có được kết quả được định dạng đúng. Bạn không thể làm điều này trong khi ghi đè __tostring vì bạn sẽ gặp khó khăn khi truy cập vào __tostring của siêu và nếu bạn gọi __tostring của Pair, một luồng tràn ngăn xếp xảy ra từ đệ quy.

Các vấn đề liên quan