在Ruby中将哈希转换为字符串

9

假设我们有一个哈希表:

flash = {}
flash[:error] = "This is an error."
flash[:info] = "This is an information."

我想将它转换为字符串:
"<div class='error'>This is an error.</div><div class='info'>This is an information".

在一个漂亮的一行代码中 ;)

我发现了这样的东西:

flash.to_a.collect{|item| "<div class='#{item[0]}'>#{item[1]}</div>"}.join

这解决了我的问题,但也许哈希表类中有更好的解决方案?
5个回答

25

Hash 包含 Enumerable,所以你可以使用 collect:

flash.collect { |k, v| "<div class='#{k}'>#{v}</div>" }.join

0

您可以使用以下方式获取哈希表中的键:

flash.keys

然后你可以从那里构建一个新的字符串数组,然后将它们连接起来。所以大概是这样:

flash.keys.collect {|k| "<div class=#{k}>#{flash[k]}</div>"}.join('')

这样行吗?


0

inject非常方便:

flash.inject("") { |acc, kv| acc << "<div class='#{kv[0]}'>#{kv[1]}</div>" }

0
[:info, :error].collect { |k| "<div class=\"#{k}\">#{flash[k]}</div>" }.join

到目前为止,所提出的解决方案唯一的问题是你通常需要按特定顺序列出闪存消息,而散列表没有它,所以在我看来最好使用预定义数组。

如果你需要使用Ruby 1.8,你可以借用ActiveSupport的OrderedHash,或者使用Ruby 1.9。 - molf

0

或者可能?

class Hash
  def do_sexy
    collect { |k, v| "<div class='#{k}'>#{v}</div>" }.flatten
  end
end

flash = {}
flash[:error] = "This is an error."
flash[:info] = "This is an information."

puts flash.do_sexy

#outputs below
<div class='error'>This is an error.</div>
<div class='info'>This is an information.</div>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接