我的问题是如何在不使用括号和引号的情况下将数组元素转换为ruby 1.9中的字符串。我有一个数组(数据库提取),我想用它来创建一个定期报告。
myArray = ["Apple", "Pear", "Banana", "2", "15", "12"]
在ruby 1.8中我有以下一行
reportStr = "In the first quarter we sold " + myArray[3].to_s + " " + myArray[0].to_s + "(s)."
puts reportStr
产生了(想要的)输出
在第一季度,我们卖掉了2个Apple。
ruby 1.9中相同的两行产生(不想要)
在第一季度,我们卖出了[“2”] [“Apple”]。
阅读文档后 Ruby 1.9.3 doc#Array#slice 我以为我可以生成像
这样的代码reportStr = "In the first quarter we sold " + myArray[3] + " " + myArray[0] + "(s)."
puts reportStr
返回运行时错误
/home/test/example.rb:450:in`+':无法将Array转换为String(TypeError)
我目前的解决方案是使用临时字符串删除括号和引号,例如
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
一般都有效。
然而,如何做到更优雅的“红宝石”方式呢?
答案 0 :(得分:27)
您可以使用.join
方法。
例如:
my_array = ["Apple", "Pear", "Banana"]
my_array.join(', ') # returns string separating array elements with arg to `join`
=> Apple, Pear, Banana
答案 1 :(得分:2)
使用插值而不是连接:
reportStr = "In the first quarter we sold #{myArray[3]} #{myArray[0]}(s)."
它更惯用,更高效,需要更少的输入,并自动为您调用to_s
。
答案 2 :(得分:1)
如果你需要为多个水果做这个,最好的方法是转换数组并使用每个语句。
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.
答案 3 :(得分:1)
您可以将其视为arrayToString()
array = array * " "
如,
myArray = ["One.","_1_?! Really?!","Yes!"]
=>
"One.","_1_?! Really?!","Yes!"
myArray = myArray * " "
=>
"One. _1_?! Really?! Yes."