【问题标题】:How to know if a value is a luasocket object?如何知道一个值是否是一个 luasocket 对象?
【发布时间】:2014-12-21 19:51:24
【问题描述】:

我注意到 luasocket 似乎没有提供一种方法来判断一个值是否是一个 luasocket 对象。

比较元表的常用方法不起作用,因为不同的套接字对象类型具有不同的元表。 元表中似乎也没有任何一致的值要检查(例如,相同的__tosting 元方法)

那么:如何知道他们拥有的值是否是 luasocket 对象?

【问题讨论】:

    标签: lua luasocket


    【解决方案1】:

    既然你只想知道它是否是一个 LuaSocket 对象以便你可以得到 fd,为什么不看看这个对象是否有一个 getfd() 方法呢?作为奖励,这将适用于在对象上提供此方法的当前和未来的库,而不仅仅是 LuaSocket。

    这种技术被称为'duck typing'

    【讨论】:

    • 我想你可以检查文件元表;然后检查 getfd 方法;然后错误...
    【解决方案2】:

    你没有。通常,您应该自己跟踪这类事情。您相信您传递的对象是您所期望的。如果您不确定,您可以随时使用pcall 对其调用函数并捕获任何错误。

    【讨论】:

    • 我问,因为我想创建一个函数来获取传递给它的任何内容的 fd:接受 lua 文件对象、luasocket 对象、libev 对象、apr 对象......我需要告诉它们之间的区别以知道使用哪个例程。
    • @daurnimator:什么是“fd”?
    • @daurnimator:假设您在具有文件描述符的平台上,您始终可以使用我建议的pcall 方法。也就是说,为每个可能的类型 X 调用“从 X 获取文件描述符”函数,但将其包装在 pcall 中。如果它失败了,那么显然它不是 X 类型。虽然这只有在“从 X 获取文件描述符”函数都是 Lua 函数时才有效。但归根结底,没有办法确定任何特定对象来自任何特定地点。
    • 确定有办法:缓存 luasocket 使用的所有元表,并检查对象的元表是否与其中之一匹配。只是我希望有更好的方法
    • 不是测试类型,而是将相同的方法(具有不同的实现)添加到所有涉及的类型的方法表中。然后你可以简单地做value:mymethod()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-29
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 2010-11-30
    相关资源
    最近更新 更多