2009-09-22 5 views
2

J'écris une petite bibliothèque qui écrit des données dans un fichier. certaines des données sont des chaînes, certaines ne le sont pas - des choses comme des valeurs booléennes (vrai/faux) ...Ruby: chaîne de guillemets automatiques, pas d'autres données, lors de l'écriture dans un fichier?

Lorsque j'ai une chaîne pour les données, je veux écrire la chaîne dans le fichier avec des guillemets autour . donc une chaîne comme "ceci est une chaîne de données" serait écrite dans le fichier avec les guillemets autour d'elle.

Lorsque j'ai d'autres types de données, comme un booléen, je veux écrire la valeur booléenne dans le fichier sans les guillemets. donc, false serait écrit comme faux - pas de guillemets autour de lui.

Y at-il un moyen de citer/ne pas citer automatiquement la valeur d'une variable, selon que la variable contenant la valeur est ou non une chaîne, lors de l'écriture dans un fichier?

Répondre

5

est Simplest #inspect

 
--------------------------------------------------------- Object#inspect 
    obj.inspect => string 
------------------------------------------------------------------------ 
    Returns a string containing a human-readable representation of 
    _obj_. If not overridden, uses the +to_s+ method to generate the 
    string. 

     [ 1, 2, 3..4, 'five' ].inspect #=> "[1, 2, 3..4, \"five\"]" 
     Time.new.inspect     #=> "Wed Apr 09 08:54:39 CDT 2003" 

Vous pouvez le tester dans la CISR.

irb> "hello".inspect 
#=> "\"hello\"" 
irb> puts _ 
"hello" 
#=> nil 
irb> true.inspect 
#=> "true" 
irb> puts _ 
true 
#=> nil 
irb> (0..10).to_a.inspect 
#=> "[0,1,2,3,4,5,6,7,8,9,10]" 
irb> puts _ 
[0,1,2,3,4,5,6,7,8,9,10] 
#=> nil 

Mais pour les types généraux, vous pouvez envisager YAML ou JSON.

+0

merci, rampion! Cela fonctionne parfaitement pour ce que je fais. –

0

Avez-vous essayé d'utiliser kind_of ?.

Exemple: variable.kind_of? String

1

C'est une façon de le faire:

if myvar.class == String 
    #print with quotes 
else 
    #print value 
end 
0

Supposant que vos données sont de type textuel, puis en faisant

data.match(/true|false/).nil? ? "'#{data}'" : data 

devrait être ce que vous voulez.

Questions connexes