web-dev-qa-db-fra.com

ruby 1.9 comment convertir un tableau en chaîne sans crochets

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?

10
Chris

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.

2
Agis

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
25
Santosh Sindham

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.
1
hirolau

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."

0