2011-08-22 231 views
24

在Pascal中,我有writewriteln。顯然Lua的print類似於Pascal的writeln。我們有類似Pascal的write嗎?連續的打印命令如何將它們的輸出發送到同一行?Lua在同一行上打印

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

輸出:

Hello 
world 

我想有這樣的:

Hello world 
+10

它是* Lua *,而不是* LUA *。 – lhf

回答

50

使用io.write代替print,這意味着簡單的用途,如調試,無論如何。

+1

這是最短的正確答案。 – AlexStack

+3

好吧,這就是爲什麼@lhf是Lua語言的創造者之一。 :) – felipsmartins

4

作爲替代,只是建立你的字符串,然後將其與一個print

寫出來你可能並不總是有訪問io庫。

+0

如果您無法訪問'io'庫,您爲什麼可以訪問'print'? –

+2

因爲您可能處於嵌入式環境或重新定義'print'的其他受限環境。例如魔獸世界。 – sylvanaar

16

擴大lhf's correct answerio庫是生產用途的首選。

基本庫中的print函數實現爲原始功能。它允許快速和骯髒的腳本來計算某些東西並打印出答案,而對其表示的控制很少。它的主要好處是它強制所有參數爲string,並且它將輸出中的每個參數用製表符分隔並提供一個換行符。

當需要對輸出進行詳細控制時,這些優點很快就會變成缺陷。爲此,你真的需要使用io.write。如果您在同一個程序中混合使用printio.write,則可能會絆倒另一個缺陷。 print明確使用C stdout文件句柄。這意味着如果你使用io.output來改變輸出文件的句柄,io.write會做你期望的,但是print不會。

一個很好的折中方案可以實現print的替代方案io.write。它可能看起來像這樣簡單未測試樣本的地方,我試着寫清楚,而不是最佳的,仍然「正確」處理nil參數:

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 

一旦你實現自己的print版本,那麼就可以試圖以其他方式爲您的應用程序改進它。使用比tostring()更多的格式化控件是一個好主意。另一個是考慮除了製表符以外的分隔符。

+3

這也可以寫成函數print(...)io.write(table.concat({...},「\ t」),「\ n」)end',代價是創建一個表格,執行級聯。 – lhf

+2

但是,只有當所有參數都是字符串或數字,因爲['table.concat'](http://www.lua.org/source/5.1/ltablib.c.html#tconcat)在每個元素上調用'lua_isstring()'的表......與基本庫'print'比較,每個傳遞的參數都會調用'tostring'。 – RBerteig

+1

是的,你是對的! – lhf

-4

如果你想使用的打印你這樣做

打印(「世界你好」)

一切其間的商將得到印刷

3

你可以使用變量「你好」和「世界」。然後再連接它們。像這樣:

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

print(h..w) 

在這種情況下,它將顯示爲「HelloWorld」。但這很容易解決。希望這有助於!

0

我在使用io.write打印時發現的問題是,有時您希望實際創建一個新行,您必須在io.write行的末尾放置「\ n」,例如

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

東西,我想通了,但我剛開始學習Lua和這對我來說是一個很好的問題,有更簡單的方法來做到io.write但最終沒有使用\ n作爲一個新的生產線?我發現在io.write上使用print會導致我在算術,變量等方面遇到一些麻煩......當我在同一行打印後添加它們時,我更喜歡使用io.write,但\ n會添加額外的代碼。