如何在lua中使用pcall调用类方法?

时间:2018-10-15 11:24:35

标签: lua

如何在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')

3 个答案:

答案 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