【发布时间】:2014-12-21 19:51:24
【问题描述】:
我注意到 luasocket 似乎没有提供一种方法来判断一个值是否是一个 luasocket 对象。
比较元表的常用方法不起作用,因为不同的套接字对象类型具有不同的元表。
元表中似乎也没有任何一致的值要检查(例如,相同的__tosting 元方法)
那么:如何知道他们拥有的值是否是 luasocket 对象?
【问题讨论】:
我注意到 luasocket 似乎没有提供一种方法来判断一个值是否是一个 luasocket 对象。
比较元表的常用方法不起作用,因为不同的套接字对象类型具有不同的元表。
元表中似乎也没有任何一致的值要检查(例如,相同的__tosting 元方法)
那么:如何知道他们拥有的值是否是 luasocket 对象?
【问题讨论】:
既然你只想知道它是否是一个 LuaSocket 对象以便你可以得到 fd,为什么不看看这个对象是否有一个 getfd() 方法呢?作为奖励,这将适用于在对象上提供此方法的当前和未来的库,而不仅仅是 LuaSocket。
这种技术被称为'duck typing'。
【讨论】:
你没有。通常,您应该自己跟踪这类事情。您相信您传递的对象是您所期望的。如果您不确定,您可以随时使用pcall 对其调用函数并捕获任何错误。
【讨论】:
pcall 方法。也就是说,为每个可能的类型 X 调用“从 X 获取文件描述符”函数,但将其包装在 pcall 中。如果它失败了,那么显然它不是 X 类型。虽然这只有在“从 X 获取文件描述符”函数都是 Lua 函数时才有效。但归根结底,没有办法确定任何特定对象来自任何特定地点。
value:mymethod()。