如何在Lua中使用pcall
调用类方法?
我尝试了pcall(instance:method, arg)
,但是没有用。
我也尝试过pcall(instance.method, instance, arg)
,但这也不起作用。
我用谷歌搜索了一个解决方案,但找不到。
一个例子:
local ValueOwnerMap = {}
ValueOwnerMap.__index = ValueOwnerMap
function ValueOwnerMap:create(key_prefix)
local instance = {}
setmetatable(instance, ValueOwnerMap)
instance.key = key_prefix .. ':value-owner-map'
return instance
end
function ValueOwnerMap:get(value)
return redis.call('HGET', self.key, value)
end
function ValueOwnerMap:put(value, owner_id)
return redis.call('HSETNX', self.key, value, owner_id)
end
function ValueOwnerMap:del(value)
return redis.call('HDEL', self.key, value)
end
local value_owner_map = ValueOwnerMap:create('owner:key')
local success, data = pcall(value_owner_map:put, 'a_value', 'a_owner_id')
答案 0 :(得分:2)
instance:method(arg)
是instance.method(instance,arg)
的糖。因此,尝试
pcall(value_owner_map.put, value_owner_map, 'a_value', 'a_owner_id')
答案 1 :(得分:0)
下一行替换问题中块的最后一行。可以。
local success, data = pcall(function () value_owner_map:put('a_value', 'a_owner_id') end)
谢谢大家分享
答案 2 :(得分:-1)
pcall(f,arg1,···)
在保护模式下使用给定参数调用函数f。这意味着f内部的任何错误都不会传播。相反,pcall捕获错误并返回状态码。 lua ref
但是在保护模式下调用函数有一些限制,尤其是当您使用lua的':'运算符“所谓的合成糖”时。 解决此限制的一种方法是将其放入函数中
pcall(function () value_owner_map:put('a_value', 'a_owner_id') end)
此方法也照常捕获错误:
local ok, msg = pcall(function () error('Phony Error') end)
if ok then
print("No error")
else
print("Got error".. tostring(msg))
end
-- Result:
-- Got error test.lua:53: Phony Error