Lua中的打印功能是如何工作的?`__tostring`和`__tostring__`有什么区别?

我注意到 Torch 中有时会使用 __tostring__。在我的 torch-dataframe 项目中,我有一个 __tostring 用来处理 print(my_data)。它在裸的 Torch 中的行为完全如预期,但当我运行 iTorch 时,它还会打印原始的底层数据表,就好像它打印了一个单独的返回语句一样。

在查阅文档后,我发现 Torch 经常使用 __tostring__,因此我很想知道它们之间的区别是什么?从 R 转过来后,Lua 的 print 调用更能理解,因为所有的类都能定义自己的 print.class,以便整洁地处理输出,而没有像以上 iTorch 的情况那样发生的副作用。

点赞
用户1688185
用户1688185

默认情况下是这样的:

[...] print 总是调用 tostring 来格式化它的输出。然而,当格式化一个对象时,tostring 首先检查这个对象是否有一个带有 __tostring 字段的 metatable。如果是这种情况,tostring 调用相应的值(必须是一个函数)来完成它的工作,将对象作为参数传递。这个元方法返回的任何东西都是 tostring 返回的结果。

来源:PiL,13.3

举例:

> t = setmetatable({}, {__tostring = function(x) return "foo" end})
> print(t)
foo

当你使用Torch 类系统时,会创建一个适当的元表。当调用 __tostring 时,这个元表将查找 __tostring__,如果找到,将使用相应的函数(有关详细信息,请参见:这些 部分)。

举例:

 > do local Foo = torch.class("Foo"); function Foo:__tostring__() return "this is foo" end end
 > f = Foo(); print(f)
 this is foo

因此,如果你实现了一个自定义的 Torch 类,你只需要覆盖 __tostring__,因为 Torch 会处理其余部分。

更新

为什么 iTorch 在其输出中添加了额外的 print 语句?

iTorch 需要torch/env,它替换了默认的 print 函数。这就解释了你得到的输出。

2016-04-14 07:53:09