0

我注意到字符串、数字、bool 和 nil 数据似乎可以直接使用。但是当涉及到函数、表格等时,您会得到一个引用而不是实际的对象。

这种现象有名字吗?是否有术语描述这两组类型的处理方式之间的区别?

a = "hi"    
b = 1
c = true
d = nil
e = {"joe", "mike"}
f = function () end
g = coroutine.create(function () print("hi") end)

print(a) --> hi
print(b) --> 1
print(c) --> true
print(d) --> nil
print(e) --> table: 0x103350
print(f) --> function: 0x1035a0
print(g) --> thread: 0x103d30
4

5 回答 5

3

您在这里看到的是编译器尝试返回对象的字符串表示形式。对于简单的对象类型,已经提供了 __tostring 实现,但对于其他更复杂的类型,没有直观的方法来返回字符串表示。

请参阅Lua:为自定义用户数据提供一个 tostring 方法以获取更多信息,这可能会有所帮助!

于 2013-02-12T11:48:17.713 回答
1

在 Lua 中,数字是值,其他所有内容只能通过引用访问。但是打印上的不同行为仅仅是因为无法实际打印函数(虽然表可能具有打印的默认行为,但它们没有 - 可能是因为它们被允许具有循环引用)。

于 2013-02-12T11:50:17.103 回答
1

.Net(Microsoft Visual Basic、Visual C++ 和 C#)将它们描述为值类型和引用类型,其中引用类型通过引用引用值,而值类型保存实际值。

我不认为 lua 考虑太多,因为它应该是一种更简单的解释语言,最终它并不重要,因为 lua 是一种相当弱类型的语言(即除了抛出之外它不会强制类型安全当您尝试对无法使用的类型使用操作时出现错误)。

无论哪种方式,以我的经验,大多数程序员都将它们理解为“值类型”和“引用类型”,所以我会说它们是最好坚持使用的两个术语。

于 2013-02-25T20:29:13.373 回答
0

你看到的是print函数的行为。它将通过tostring在它们上使用它的论点。print可以通过io.write这样使用来实现(简化一点):

function print(...)
    local args = {n = select('#',...), ...}
    for i=1,args.n do
        io.write(tostring(args[i]), '\t')
    end
    io.write('\n')
end

您应该注意到对 的调用tostring。默认情况下,它返回数字、布尔值和字符串的表示形式。由于没有合理的默认方法将其他类型转换为字符串,因此它只显示类型和指向对象的无用内部指针(以便您可以区分实例)。您可以在此处查看源代码

于 2013-02-12T19:55:53.707 回答
0

你会感到惊讶,但 Lua 中没有值/引用的区别。:-)
在此处此处阅读。

于 2013-02-12T20:52:45.843 回答