[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: How to overwrite/implement '__len'?
- From: Clemens Hintze <ml-lua@...>
- Date: Tue, 13 Jun 2006 17:38:45 +0200
Hello,
allthough I am interested in Lua since ca. Lua 5.0 but I only recently
have the opportunity to investigate it further. Right now, I try to
grasp the OO-like programming style using Lua.
As Lua seems to be very flexible despite its few clean and concise
concepts, I thought I may be able to use it like I am used to, while
programming in other languages before. But there seem something slipping
me right now ...
I have already searched in the mailing list archive, but found no answer
that really convince me, that what I want is not possible in Lua.
So after this long introduction I come to my problem.
I try to implement a Range class, that will contains start, stop and
step members to describe a range (list) of numbers without explicitely
instanciating it. That means a range (1,9,2) would virtually describe
the list [1, 3, 5, 7, 9[.
That already works. But now I would also allow for using of operator '#'
to get the length of that range. My implementation currently is as follows:
Range = {}
setmetatable(Range, Range)
Range.__index = Range
function Range:new(b, e, s)
return setmetatable({ start = b, stop = e, step = s or 1 }, self)
end
function Range:__len()
return math.floor((self.stop - self.start + 1) / self.step + 0.5)
end
I would like to use it like e.g. this:
r1 = Range:new(1, 9, 2)
print (#r1) -- displaying 5 (but does not right now!)
But unfortunately I get only a '0' every time. But calling it like this:
print(Range.__len(r1))
or even this:
print(r1:__len())
delivers the expected '5'. So I looked into the reference manual and it
seems that my '__len' will never be called because type(Range) == "table".
Now my question is: how do I possibly achieve my desire? It ought to be
possible IMO, as tables are Lua's way to build more complex
datastructures if I did understand correctly. And then it could make
sense to implement/overwrite the operator '#' (thinking for single
pointered lists, for instance).
So what can I do? Thanks in advance for any hint.
Ciao,
Clemens.