web-dev-qa-db-fra.com

Impression Lua sur la même ligne

En Pascal, j'ai write et writeln. Apparemment, le print de Lua est similaire au writeln de Pascal. Avons-nous quelque chose de similaire à write de Pascal? Comment les commandes d'impression consécutives peuvent-elles envoyer leur sortie sur la même ligne?

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

Production:

Hello
world

Je veux avoir ceci:

Hello world
33
AlexStack

Utilisation io.write à la place print, qui est de toute façon destiné à des utilisations simples, comme le débogage.

71
lhf

Développé sur réponse correcte de lhf , la bibliothèque io est préférée pour une utilisation en production.

La fonction print dans la bibliothèque de base est implémentée comme une capacité primitive. Il permet des scripts rapides et sales qui calculent quelque chose et impriment une réponse, avec peu de contrôle sur sa présentation. Ses principaux avantages sont qu'il contraint tous les arguments à string et qu'il sépare chaque argument dans la sortie avec des tabulations et fournit une nouvelle ligne.

Ces avantages deviennent rapidement des défauts lorsqu'un contrôle détaillé de la sortie est requis. Pour cela, vous devez vraiment utiliser io.write. Si vous mélangez print et io.write Dans le même programme, vous pourriez trébucher sur un autre défaut. print utilise explicitement le descripteur de fichier C stdout. Cela signifie que si vous utilisez io.output Pour modifier le descripteur du fichier de sortie, io.write Fera ce que vous attendez mais pas print.

Un bon compromis peut être d'implémenter un remplacement de print en termes de io.write. Cela pourrait sembler aussi simple que cet exemple non testé où j'ai essayé d'écrire clairement plutôt qu'optimalement et de toujours gérer les arguments nil "correctement":

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

Une fois que vous implémentez votre propre version de print, il peut être tentant de l'améliorer par d'autres moyens pour votre application. Utiliser quelque chose avec plus de contrôle de formatage que celui offert par tostring() est une bonne idée. Un autre envisage un séparateur autre qu'un caractère de tabulation.

21
RBerteig

Comme alternative, créez simplement votre chaîne puis écrivez-la avec un seul print

Il se peut que vous n'ayez pas toujours accès à la bibliothèque io.

6
sylvanaar

Vous pouvez utiliser des variables pour "Bonjour" et "Monde". Ensuite, concaténez-les plus tard. Comme ça:

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

print(h..w)

Il sera affiché, dans ce cas, comme "HelloWorld". Mais c'est facile à réparer. J'espère que cela vous a aidé!

4
Searous