local function url(url_str)
local self
if type(url_str) == "string" then
self = url_pat:match(url_str)
elseif type(url_str) == "table" and url_str.url then
return url(url_str.url)
end
if self then
self.socket = self.host ..
(self.port and (":"..("%d"):format(self.port)) or "")
self[0] = self.socket
self.xpath = xpath:match(url_str)
self.url = "" .. "://" .. self.xpath
self.route = route
return setmetatable({}, {
--for brevity, I'm only including the function in question.
__eq = function(a, b) return a.url == b.url end ,
})
end
end
This would seem to support "similar enough".
If I run tests in the same file as this code, it never fails to see the functions as the same.
--...
--complete module definition is above this comment...
for i = 1, 10001 do
local a = url("mcp://host/thread/name/"..tostring(i))
collectgarbage()
local b = url("mcp://host/thread/name/"..tostring(i) .."/")
assert(a == b)
end
print("passed!")
--> passed!
If I run them in a different file (require the module), it _often_ does. That is, it's not only within Lua Busted.
If I run the garbage collector between assignments, it will fail every time.
local url = "">
local a = url("mcp://host/thread/name")
collectgarbage()
local b = url("mcp://host/thread/name/")
print(a == b)
-->false
print(getmetatable(a).__eq, getmetatable(b).__eq)
--> function: 00000000004337D0function: 00000000003E9550
Is this expected? Can you provide some insight as to how I can understand this better?
-Andrew