Pourquoi ne pas Ruby ont un réel StringBuffer ou StringIO?

J'ai lu récemment une belle post sur l'utilisation de StringIO en Ruby. Ce que l'auteur ne mentionne pas, cependant, c'est que StringIO est juste un "I". Il n'y a pas de "O". Vous ne peut pas de le faire, par exemple:

s = StringIO.new
s << 'foo'
s << 'bar'
s.to_s
# => should be "foo\nbar"
# => really is ''`

Ruby vraiment besoin d'un StringBuffer comme l'a fait la Java. StringBuffers servir deux objectifs importants. Tout d'abord, ils vous permettent de tester la sortie de la moitié de ce que Ruby StringIO n'. Deuxièmement, ils sont utiles pour la construction de longues chaînes de petites pièces -- quelque chose que Joel nous rappelle encore et encore est par ailleurs très très lent.

Est-il une bonne alternative?

Il est vrai que les Chaînes en Ruby sont mutables, mais cela ne signifie pas que nous devons toujours compter sur cette fonctionnalité. Si stuff est grande, les performances et les besoins en mémoire de cette, par exemple, est très mauvais.

result = stuff.map(&:to_s).join(' ')

La "bonne" façon de le faire en Java:

result = StringBuffer.new("")
for(String s : stuff) {
  result.append(s);
}

Bien que mon Java est un peu rouillé.

  • "Mega Femme De Ménage?" Jamais entendu parler de lui. Jamais vraiment cru en StringBuffers soit, mais j'ai toujours l'habitude, par peur de quelqu'un, voir mon code. Mais vraiment, est-ce que des trucs jamais ajouter jusqu'à?
  • Probablement un "SpaceBalls" référence.
  • Mega femme de chambre a été supprimé comme un dommage collatéral de se débarrasser de jurons.
  • Votre chaîne de rejoindre exemple n'est pas équivalent au code Java. Comme vous le mentionnez, Ruby chaînes sont mutables, donc en Ruby, vous venez de le faire: stuff.inject('') { |res, s| res << s.to_s }. Vous pouvez vous fier sur Ruby cordes mutable, il ne va pas changer comme elle allait se briser à chaque application Ruby dans l'existence.
  • Je ne comprends vraiment pas pourquoi StringIO ne dispose pas d'une méthode to_s. C'est une classe que de gérer une chaîne de caractères, donc si vous voulez que la chaîne que vous avez à demander spécifiquement pour elle. Il doit avoir une méthode to_s depuis, c'est le rubis de la convention, mais il ne le fait pas. (Quelqu'un peut me corriger si je me trompe)
  • En Ruby 3, les littéraux de chaîne serait immuable. Cependant, nous pouvons toujours utiliser mutable String.new ou +''.