2

私は混合型のハッシュを持っています:

stuff = {:pack_one => ["blue_item", "red_item"], :pack_two => [:green_item, :purple_item, :yellow_item]}

そして、それを次のような文に変換する必要があります。

"pack_one contains a blue_item and red_item and pack_two contains a green_item, purple_item and yellow_item"

したがって、Enumerable を使用してハッシュを反復処理し、文を作成する必要があると思いますが、どのようにすればよいでしょうか?

4

3 に答える 3

6

私の解決策。@Eurekaの回答よりも少し厳しい要件に適合します。

strings = stuff.map do |key, values|
  "#{key} contains a #{values[0..-2] * ', '} and #{values.last}"
end
puts strings.join ' and '
于 2012-11-12T23:05:06.550 に答える
3

ActiveSupportを使用できる場合、チートは次のとおりです。

require 'active_support/core_ext/array/conversions'
stuff.map{|k,v| "#{k} contains a #{v.to_sentence}"}.join(" and ")

結果:

1.9.3p125 > require 'active_support/core_ext/array/conversions'
 => true 
1.9.3p125 > stuff.map{|k,v| "#{k} contains a #{v.to_sentence}"}.join(" and ")
 => "pack_one contains a blue_item and red_item and pack_two contains a green_item, purple_item, and yellow_item" 

編集: オックスフォードのカンマを取り除くには、明示的にlast_word_connectorオプションを指定します:

1.9.3p125 > stuff.map{|k,v| "#{k} contains a #{v.to_sentence(last_word_connector: " and ")}"}.join(" and ")
 => "pack_one contains a blue_item and red_item and pack_two contains a green_item, purple_item and yellow_item" 
于 2012-11-12T23:28:21.517 に答える
0

Enumerable#mapと を使用したソリューションは次のArray#joinとおりです。

stuff.map do |k, v|
  "#{k} contains a #{v.size > 2 ? v[0..-2].join(", ") + " and " + v[-1].to_s : v.join(' and ')}"
end.join(" and ")
=> "pack_one contains a blue_item and red_item and pack_two contains green_item and purple_item and yellow_item"

編集:要件に完全に適合するようになりました。

于 2012-11-12T23:01:52.857 に答える