有没有一种表达式的名称,它返回它本身而不是引用?

我注意到字符串、数字、布尔和空值数据似乎很容易处理。但是当涉及到函数、表等时,你得到的是引用而不是实际对象。

这种现象有一个名字吗?有没有术语描述这两组类型处理的区别?

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
点赞
用户1752653
用户1752653

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

请参见 Lua:为自定义的 userdata 提供 tostring 方法 获取更多信息,可能会有所帮助!

2013-02-12 11:48:17
用户938694
用户938694

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

2013-02-12 11:50:17
用户221509
用户221509

你正在看到的是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-12 19:55:53
用户1847592
用户1847592

你会惊讶地发现,在 Lua 中没有值/引用的区分。:-)

请阅读这里这里

2013-02-12 20:52:45
用户1377706
用户1377706

.Net (Microsoft Visual Basic, Visual C++ and C#) 将其描述为值类型(value types)和引用类型(reference types),其中引用类型是通过引用指向值,而值类型则存储实际的值。

我认为 lua 不太关注这个问题,因为它旨在成为一种更简单的解释性语言。最终,这并不重要,因为 lua 是一种弱类型语言(即它并不强制执行类型安全,除非您试图在不能使用的类型上执行操作时会抛出错误)。

不管怎样,在我看来,大多数程序员都理解 'value types' 和 'reference types',所以我认为最好坚持使用这两个术语。

2013-02-25 20:29:13