2011-08-22 17 views
24

W języku Pascal mam write i writeln. Najwyraźniej Lua's print jest podobna do writeln z Pascal. Czy mamy coś podobnego do write z Pascal? W jaki sposób kolejne polecenia drukowania wysyłają swoje wyniki do tej samej linii?Lua drukuje na tej samej linii

print("Hello") 
print("World") 

wyjściowa:

Hello 
world 

Chcę mieć to:

Hello world 
+10

To jest * Lua *, a nie * LUA *. – lhf

Odpowiedz

50

Zastosowanie io.write zamiast print, która jest przeznaczona do prostych zastosowań, takich jak debugowanie, tak.

+1

to jest najkrótsza poprawna odpowiedź. – AlexStack

+3

cóż, dlatego @lhf jest jednym z twórców języka Lua. :) – felipsmartins

4

Jako alternatywa, tylko budować swój ciąg następnie napisać go z jednym print

może nie zawsze mają dostęp do biblioteki io.

+0

Jeśli nie masz dostępu do biblioteki 'io', dlaczego miałbyś dostęp do' print'? –

+2

Ponieważ możesz być w środowisku osadzonym lub innym ograniczonym środowisku, które na nowo definiuje 'print'. Na przykład World of Warcraft. – sylvanaar

16

Rozszerzając bibliotekę lhf's correct answer, do celów produkcyjnych preferowana jest biblioteka io.

Funkcja print w bibliotece podstawowej jest zaimplementowana jako funkcja pierwotna. Pozwala na szybkie i brudne skrypty, które obliczają coś i drukują odpowiedź, z niewielką kontrolą nad jej prezentacją. Jego główne zalety polegają na tym, że wymusza on wszystkie argumenty pod adresem string i oddziela każdy argument na wyjściu za pomocą zakładek i dostarcza znak nowej linii.

Korzyści te szybko stają się wadami, gdy wymagana jest szczegółowa kontrola wydajności. W tym celu naprawdę musisz użyć io.write. Jeśli miksujesz print i io.write w tym samym programie, możesz potknąć się o kolejną wadę. print jawnie używa uchwytu pliku C stdout. Oznacza to, że jeśli zmienisz uchwyt pliku wyjściowego na io.output, io.write zrobi to, czego oczekujesz, ale print nie będzie.

Dobrym kompromisem może być wdrożenie zamiennika dla print pod względem io.write. Może to wyglądać tak proste, jak to nietestowanego próbki, gdzie starałem się pisać wyraźnie, zamiast optymalnie i nadal obsługiwać nil argumentów „prawidłowo”:

local write = io.write 
function print(...) 
    local n = select("#",...) 
    for i = 1,n do 
     local v = tostring(select(i,...)) 
     write(v) 
     if i~=n then write'\t' end 
    end 
    write'\n' 
end 

Po realizują własną wersję print, to można kusząc, aby poprawić go w inny sposób dla twojej aplikacji. Używanie czegoś z większą kontrolą formatowania niż oferowana przez tostring() jest dobrym pomysłem. Innym rozważa się separator inny niż znak tabulacji.

+3

Może to być również zapisane jako 'funkcja print (...) io.write (table.concat ({...}," \ t ")," \ n ") koniec' za cenę utworzenia tabeli i wykonywanie konkatenacji. – lhf

+2

Ale tylko wtedy, gdy wszystkie argumenty są ciągami lub liczbami od ['table.concat'] (http://www.lua.org/source/5.1/ltablib.c.html#tconcat) nazywają' lua_isstring() 'na każdym elemencie tabeli ... w porównaniu do biblioteki bazowej 'print', która wywołuje' tostring' na każdym parametrze przekazanym. – RBerteig

+1

Tak, masz rację! – lhf

-4

Jeśli chcesz użyć print zrobiłbyś to

print ("Hello World")

Wszystko pomiędzy nimi ilorazy zostanie wydrukowany

3

Można używać zmiennych dla "Hello" i "Świat". Następnie połącz je później. W ten sposób:

local h = "Hello" 
local w = "World" 

print(h..w) 

Zostanie wyświetlony, w tym przypadku, jako "HelloWorld".Ale to jest łatwe do naprawienia. Mam nadzieję, że to pomogło!

0

Problem, który napotykam przy użyciu io.write over print, polega na tym, że jeśli chcesz rzeczywiście utworzyć nową linię, musisz umieścić "\ n" na końcu linii pliku io.write na przykład

io.write "hello \n" 
io.write "world \n" 

coś zorientowali się, ale właśnie rozpoczął naukę Lua i to jest dobre pytanie do mnie, istnieje łatwiejszy sposób zrobić io.write ale nie używać \ n na końcu do nowej linii? Uważam, że używanie print przez io.write powoduje mi pewne kłopoty z arytmetyką, zmiennymi itp., Kiedy dodam je po wydrukowaniu w tej samej linii, więc wolę używać io.write, ale \ n dodaje dodatkowy kod.

Powiązane problemy