是否有表达式返回它们的名称,而不是引用?

时间:2013-02-12 11:42:39

标签: lua terminology

我注意到字符串,数字,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

5 个答案:

答案 0 :(得分:3)

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

有关可能有用的更多信息,请参阅Lua: give custom userdata a tostring method

答案 1 :(得分:1)

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

答案 2 :(得分:1)

.Net(Microsoft Visual Basic,Visual C ++和C#)将它们描述为值类型和引用类型,其中引用类型引用引用值,值类型包含实际值。

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

无论哪种方式,根据我的经验,大多数程序员都将它们理解为“价值类型”和“参考类型”,所以我认为它们是最好坚持的两个术语。

答案 3 :(得分: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的来电。默认情况下,它返回数字,布尔值和字符串的表示形式。由于没有合理的默认方式将其他类型转换为字符串,因此它只显示类型和指向对象的无用内部指针(以便您可以区分实例)。您可以查看the source here

答案 4 :(得分:0)

你会感到惊讶,但Lua没有价值/参考区别。 :-)
请阅读herehere