48 votes

Impression Lua sur la même ligne

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

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

Sortie :

Hello
world

Je veux avoir ça :

Hello world

87voto

lhf Points 30556

Utilisez io.write au lieu de print qui est destiné à des utilisations simples, comme le débogage, de toute façon.

11 votes

C'est pourquoi @lhf est l'un des créateurs du langage Lua :)

24voto

RBerteig Points 23331

Élargir le champ d'action La bonne réponse de lhf le io est préférable pour une utilisation en production.

El print de la bibliothèque de base est implémentée comme une capacité primitive. Elle 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'elle contraint tous les arguments à la fonction 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 nécessaire. Pour cela, vous devez vraiment utiliser io.write . Si vous mélangez print y io.write dans le même programme, vous pourriez trébucher sur un autre défaut. print utilise le C stdout explicitement. Cela signifie que si vous utilisez io.output pour changer l'identifiant du fichier de sortie, io.write fera ce que vous attendez mais print ne le fera pas.

Un bon compromis peut consister à mettre en place un remplacement de l'option print en termes de io.write . Cela pourrait être aussi simple que cet échantillon non testé où j'ai essayé d'écrire clairement plutôt que de manière optimale et de gérer quand même nil arguments "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 aurez mis en place votre propre version de print il peut être tentant de l'améliorer par d'autres moyens pour votre application. L'utilisation d'un outil permettant un meilleur contrôle de la mise en forme que celui offert par le format tostring() est une bonne idée. Une autre consiste à envisager un séparateur autre qu'un caractère de tabulation.

3 votes

Cela peut aussi s'écrire comme suit function print(...) io.write(table.concat({...},"\t"),"\n") end au prix de la création d'une table et de la réalisation d'une concaténation.

2 votes

Mais seulement si tous les arguments sont des chaînes de caractères ou des nombres puisque table.concat appelle lua_isstring() sur chaque élément du tableau... par rapport à la bibliothèque de base print qui appelle tostring sur chaque paramètre passé.

0 votes

@Rberteig : comment utilisez-vous select("#",...) au lieu de simplement #arg ?

11voto

sylvanaar Points 5300

En guise d'alternative, il suffit de construire votre chaîne de caractères puis de l'écrire avec un seul print

Vous n'avez pas toujours accès à la io bibliothèque.

0 votes

Si vous n'avez pas accès à la io bibliothèque, pourquoi auriez-vous accès à print ?

10 votes

Parce que vous pourriez être dans un environnement embarqué, ou un autre environnement restreint qui redéfinit print . World of Warcraft par exemple.

0 votes

Merci pour cette réponse. Il est très facile d'oublier que cette approche existe.

6voto

Searous Points 61

Vous pourriez utiliser des variables pour "Hello" et "World". Puis les concaténer plus tard. Comme ceci :

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

print(h..w)

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

1voto

Darinth Douglas Points 11

Pour compléter la réponse de @Searous, essayez ce qui suit.

local h = "hello" local w = "world" (monde)

print(h.." "..w)

Vous pouvez concaténer les deux ensemble, il suffit de mettre un espace entre les deux variables.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X