2016-04-14 15 views
0

'daki "__tostring" ve "__tostring__" arasındaki fark nedir? Bazen Torch'de kullanılan bir __tostring__ olduğunu farkettim. Benim meşale-dataframe projemde print(my_data)'u işleyen bir __tostring var. Tam olarak ham Torch'da beklendiği gibi çalışır, ancak iTorch'u çalıştırdığımda, temel bir veri tablosunu, ayrı bir iade bildirimi basmış gibi yazdırır.Lua'nın baskısı nasıl çalışır ve Lua/Torch

Dokümanlara baktıktan sonra, Torch'un sık sık __tostring__ kullandığını fark ettim ve farkın ne olduğunu merak ediyorum. Aynı zamanda, Lua'daki print numaralı çağrıyı daha iyi anlamak, tüm sınıflar kendi çıktısını doğru bir şekilde belirleyebilen kendi print.class'u tanımlayabilen R 'den geliyor ve bende gördüğüm gibi hiçbir yan etki yok. Yukarıdaki iTorch davası. ne olur Varsayılan olarak

cevap

1

şu şekilde olmaktadır:.

[...] print hep çıktısı biçimlendirmek toString çağırır) Ancak, nesne MetaTable ile sahip olup olmadığını ilk kontrolleri toString, bir nesneyi biçimlendirirken __tostring alanı. Bu durumda, tostring, işini yapmak için ilgili değeri (bir işlev olmalıdır) çağırır ve nesneyi bir argüman olarak geçirir. Ne olursa olsun bu metamethod döner PiL, 13.3 itibaren tostring

sonucudur.

Örnek: Torch class system bir appropriate metatable oluşturulur kullanmak

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

. __tostring çağrıldığında bu metatable __tostring__'u arar ve bulunursa, ilgili işlev kullanılır (daha fazla ayrıntı için bkz: theseparts).

Örnek:

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

Yani sadece Meşale gerisini halleder beri __tostring__ geçersiz kılmak gerekiyor özel Meşale sınıf uygulamak durumunda.

GÜNCELLEME

iTorch onun çıkışına ek baskı deyimi ekler Neden?

iTorch, torch/env'un replaces the default print function olmasını gerektirir. Aldığınız çıktıları açıklayan budur.

+0

Harika! Yine de, iTorch'un ek baskı ifadesini neden çıktıya eklediğinden emin değilsiniz, ancak bu küçük bir sorundur. –

+0

Buna bir yorum ekledim. – deltheil

+0

Bu bir * kötü * kod parçasıdır. Ben '__pairs' bırakmadan çift baskı etrafında alabileceğimi sanmıyorum. Yazdırma işlevini bir 'dump()' ve 'print()' olarak değil; aklımda metalar içinde sadece '__tostring' bulunmadığında 'double()' döngüsünü seçmeliyim. Büyük bir şemayı kaçırırsam haberim olsun. –

İlgili konular