Quels sont les avantages à utiliser StringIO en Ruby par opposition à la Chaîne?
Quand est-il considéré comme propre à l'utilisation de Ruby StringIO en opposition à l'aide de la Chaîne?
Je pense comprendre la différence fondamentale entre eux comme l'a souligné "Qu'est-ce que ruby StringIO classe vraiment?", qui StringIO permet de lire et d'écrire dans une Chaîne de caractères dans un flux de manière orientée. Mais qu'est-ce que cela signifie dans la pratique?
Ce qui est un bon exemple d'une utilisation pratique pour l'utilisation de StringIO quand simplement à l'aide de la Chaîne ne serait pas vraiment le couper?
Vous devez vous connecter pour publier un commentaire.
Fondamentalement, il fait une chaîne de ressembler à un IO objet, d'où le nom de StringIO.
La StringIO classe a
read
etwrite
méthodes, de sorte qu'il peut être transmis à des parties de votre code qui ont été conçus à lire et à écrire à partir de fichiers ou de sockets. C'est agréable si vous avez une chaîne et que vous voulez qu'il ressemble un fichier pour les besoins des tests de votre fichier de code.StringIO
, si vous concevez vos fonctions IO objets vous pouvez faire des choses comme la lecture à partir d'un fichier, et sinon tuyau de l'ensemble des opérations. Donc une fonction qui prend un IO objet peut utiliser moins de mémoire si elle est utilisée avec une classe appropriée. Ainsi, cela vous permet de faire fonctionner sur une Chaîne ou un peut-être plus efficace IO objet de la même manière.StringIO
n'a pas l'air exactement comme unFile
. Une "chasse aux sorcières" je viens de croiser --File.size(StringIO.new('foo')) #=> TypeError: no implicit conversion of StringIO into String
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:Je peux faire 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 de la sorte:s = StringIO.new
mais indépendamment de cela, assurez-vous de garder à l'esprit de la chaîne est accessible via leStringIO#string
méthode.Array#<<
et puisArray#join
pour ce genre de chose, mais à l'aide deStringIO
est une grande technique.Array
comme vous décrivez est commode de écrire en, bien sûr, mais quand lecture code, le nom de la classeStringIO
est un loin meilleur indicateur de but. Pour ne pas mentionnerArray
est fondamentalement différente de la structure de données. Aussi, la neccessity d'utiliserArray#join
engage l'excès de code "bagage", et pire, de la complexité! Par exemple, c'est l'argument est défini par défaut pour un global qui est sujet à changement.