Lua的打印是如何工作的以及Lua / Torch中`__tostring`和`__tostring__`之间的区别是什么?

时间:2016-04-14 07:28:08

标签: lua torch

我注意到Torch中有时会使用__tostring__。在我的火炬数据框项目中,我有__tostring来处理print(my_data)。它的工作方式与原始Torch中的预期完全相同,但是当我运行iTorch时,它还会打印原始底层数据表,就好像它打印了一个单独的返回语句一样。

在查看文档后,我发现Torch经常使用__tostring__,因此我很好奇它的区别是什么?更好地理解Lua中的print调用也很有趣,来自R所有类都能够定义自己的print.class,它整齐地处理输出并且没有副作用比如我在上面的iTorch案例中看到的那个。

1 个答案:

答案 0 :(得分:1)

默认情况如下:

  

[{1]}始终调用tostring来格式化其输出。)但是,在格式化对象时,tostring首先检查对象是否具有带print字段的元表。如果是这种情况,__tostring调用相应的值(必须是函数)来完成其工作,将对象作为参数传递。无论这种元方法返回的是tostring

的结果

来自PiL, 13.3

示例:

tostring

使用Torch class system时,会创建appropriate metatable。调用> t = setmetatable({}, {__tostring = function(x) return "foo" end}) > print(t) foo 时,此metatable将查找__tostring,如果找到,将使用相应的函数(有关详细信息,请参阅:these parts)。

示例:

__tostring__

因此,如果你实现一个自定义的Torch类,你只能覆盖 > do local Foo = torch.class("Foo"); function Foo:__tostring__() return "this is foo" end end > f = Foo(); print(f) this is foo ,因为Torch负责其余的。

<强>更新

  

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

iTorch需要torch/env replaces the default print function。这就解释了你得到的输出。