Ma question concerne la façon de convertir des éléments de tableau en chaîne dans Ruby 1.9 sans obtenir les crochets et les guillemets. J'ai un tableau (extrait de base de données) que je souhaite utiliser pour créer un rapport périodique.
myArray = ["Apple", "Pear", "Banana", "2", "15", "12"]
En Ruby 1.8, j'avais la ligne suivante
reportStr = "In the first quarter we sold " + myArray[3].to_s + " " + myArray[0].to_s + "(s)."
puts reportStr
Qui a produit la sortie (demandée)
Au premier trimestre, nous avons vendu 2 pommes.
Les deux mêmes lignes dans Ruby 1.9 produisent (non voulu)
Au premier trimestre, nous avons vendu ["2"] ["Apple"] (s).
Après avoir lu dans la documentation Ruby 1.9.3 doc # Array # slice Je pensais pouvoir produire du code comme
reportStr = "In the first quarter we sold " + myArray[3] + " " + myArray[0] + "(s)."
puts reportStr
qui retourne une erreur d'exécution
/home/test/example.rb:450:in `+ ': impossible de convertir un tableau en chaîne (TypeError)
Ma solution actuelle consiste à supprimer les crochets et les guillemets avec une chaîne temporaire, comme
tempStr0 = myArray[0].to_s
myLength = tempStr0.length
tempStr0 = tempStr0[2..myLength-3]
tempStr3 = myArray[3].to_s
myLength = tempStr3.length
tempStr3 = tempStr3[2..myLength-3]
reportStr = "In the first quarter we sold " + tempStr3 + " " + tempStr0 + "(s)."
puts reportStr
qui fonctionne en général.
Cependant, quelle serait une manière plus élégante "Ruby" comment faire cela?
Utilisez l'interpolation au lieu de la concaténation:
reportStr = "In the first quarter we sold #{myArray[3]} #{myArray[0]}(s)."
Il est plus idiomatique, plus efficace, nécessite moins de frappe et appelle automatiquement to_s
pour vous.
Vous pouvez utiliser la méthode .join
.
Par exemple:
my_array = ["Apple", "Pear", "Banana"]
my_array.join(', ') # returns string separating array elements with arg to `join`
=> Apple, Pear, Banana
Et si vous devez le faire pour plus d'un fruit, le meilleur moyen est de transformer le tableau et de l'utiliser avec chaque instruction.
myArray = ["Apple", "Pear", "Banana", "2", "1", "12"]
num_of_products = 3
tranformed = myArray.each_slice(num_of_products).to_a.transpose
p tranformed #=> [["Apple", "2"], ["Pear", "1"], ["Banana", "12"]]
tranformed.each do |fruit, amount|
puts "In the first quarter we sold #{amount} #{fruit}#{amount=='1' ? '':'s'}."
end
#=>
#In the first quarter we sold 2 Apples.
#In the first quarter we sold 1 Pear.
#In the first quarter we sold 12 Bananas.
Vous pouvez penser à cela comme arrayToString()
array = array * " "
Par exemple.,
myArray = ["One.","_1_?! Really?!","Yes!"]
=>
"One.","_1_?! Really?!","Yes!"
myArray = myArray * " "
=>
"One. _1_?! Really?! Yes."