14

我的问题是关于如何在 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 个苹果。

ruby 1.9 中的相同两行产生(不需要)

在第一季度,我们出售了 ["2"] ["Apple"] (s)。

在阅读文档 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

这通常有效。

但是,如何做到这一点会是一种更优雅的“红宝石”方式?

4

4 回答 4

39

您可以使用该.join方法。

例如:

my_array = ["Apple", "Pear", "Banana"]

my_array.join(', ') # returns string separating array elements with arg to `join`

=> Apple, Pear, Banana
于 2014-05-29T18:49:30.703 回答
2

使用插值代替串联:

reportStr = "In the first quarter we sold #{myArray[3]} #{myArray[0]}(s)."

它更惯用,更高效,需要更少的输入并自动to_s为您调用。

于 2013-10-23T07:14:42.067 回答
1

如果您需要对多个水果执行此操作,最好的方法是转换数组并使用 each 语句。

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.
于 2013-10-23T08:19:58.583 回答
1

你可以把它想象成arrayToString()

array = array * " "

例如,

myArray = ["One.","_1_?! Really?!","Yes!"]

=> "One.","_1_?! Really?!","Yes!"

myArray = myArray * " "

=> "One. _1_?! Really?! Yes."

于 2017-06-06T19:00:26.740 回答