web-dev-qa-db-fra.com

Quels sont les avantages d'utiliser StringIO dans Ruby par opposition à String?

Quand est-il jugé approprié d'utiliser StringIO de Ruby plutôt que de simplement utiliser String?

Je pense que je comprends la différence fondamentale entre eux comme le souligne " Qu'est-ce que la classe StringIO de Ruby vraiment? ", que StringIO permet de lire et d'écrire de/vers une chaîne de manière orientée flux. Mais qu'est-ce que cela signifie pratiquement?

Quel est un bon exemple d'utilisation pratique de l'utilisation de StringIO alors que simplement utiliser String ne le couperait pas vraiment?

43
Scott Joseph

Fondamentalement, il fait ressembler une chaîne à un objet IO, d'où le nom StringIO.

La classe StringIO possède les méthodes read et write, elle peut donc être transmise à des parties de votre code conçues pour lire et écrire à partir de fichiers ou de sockets. C'est bien si vous avez une chaîne et que vous voulez qu'elle ressemble à un fichier dans le but de tester votre code de fichier.

def foo_writer(file)
  file.write "foo"
end

def test_foo_writer
  s = StringIO.new
  foo_writer(s)
  raise "fail" unless s.string == "foo"
end
68
David Grayson

J'aime vraiment StringIO pour le cas d'utilisation de l'ajout de texte ligne par ligne sans avoir à utiliser "\n" encore et encore. Par exemple, au lieu de cela:

s = ''
s << "\n" << "some text on a new line"
s << "\nthis is pretty awkward"
s = "#{s}\neven more ugly!"

Je peux le faire

s = StringIO.open do |s|
  s.puts 'adding newlines with puts is easy...'
  s.puts 'and simple'
  s.string
end

Ce qui est beaucoup plus propre. Il n'est pas nécessaire d'utiliser la forme de bloc de String.IO, vous pouvez créer un objet comme ceci: s = StringIO.new mais peu importe, assurez-vous de garder à l'esprit que la chaîne réelle est accessible via le StringIO#string méthode.

27
Steve Benner